mirror of
https://github.com/OPM/opm-simulators.git
synced 2024-12-28 18:21:00 -06:00
Pass block values to OPM-output
This commit is contained in:
parent
2264b44f38
commit
85ed4bffbf
@ -281,18 +281,25 @@ namespace Ewoms
|
||||
const Opm::data::Solution& localCellData_;
|
||||
Opm::data::Solution& globalCellData_;
|
||||
|
||||
const std::map<std::pair<std::string, int>, double>& localBlockData_;
|
||||
std::map<std::pair<std::string, int>, double>& globalBlockValues_;
|
||||
|
||||
const IndexMapType& localIndexMap_;
|
||||
const IndexMapStorageType& indexMaps_;
|
||||
|
||||
public:
|
||||
PackUnPack( const Opm::data::Solution& localCellData,
|
||||
Opm::data::Solution& globalCellData,
|
||||
const std::map<std::pair<std::string, int>, double>& localBlockData,
|
||||
std::map<std::pair<std::string, int>, double>& globalBlockValues,
|
||||
const IndexMapType& localIndexMap,
|
||||
const IndexMapStorageType& indexMaps,
|
||||
const size_t globalSize,
|
||||
const bool isIORank )
|
||||
: localCellData_( localCellData ),
|
||||
globalCellData_( globalCellData ),
|
||||
localBlockData_( localBlockData ),
|
||||
globalBlockValues_( globalBlockValues ),
|
||||
localIndexMap_( localIndexMap ),
|
||||
indexMaps_( indexMaps )
|
||||
{
|
||||
@ -332,6 +339,14 @@ namespace Ewoms
|
||||
write( buffer, localIndexMap_, data);
|
||||
}
|
||||
|
||||
// write all block data
|
||||
unsigned int size = localBlockData_.size();
|
||||
buffer.write( size );
|
||||
for (const auto& map : localBlockData_) {
|
||||
buffer.write(map.first.first);
|
||||
buffer.write(map.first.second);
|
||||
buffer.write(map.second);
|
||||
}
|
||||
}
|
||||
|
||||
void doUnpack( const IndexMapType& indexMap, MessageBufferType& buffer )
|
||||
@ -345,6 +360,19 @@ namespace Ewoms
|
||||
//write all data from local cell data to buffer
|
||||
read( buffer, indexMap, data);
|
||||
}
|
||||
|
||||
// write all block data
|
||||
unsigned int size = 0;
|
||||
buffer.read(size);
|
||||
for (size_t i = 0; i < size; ++i) {
|
||||
std::string name;
|
||||
int idx;
|
||||
double data;
|
||||
buffer.read( name );
|
||||
buffer.read( idx );
|
||||
buffer.read( data );
|
||||
globalBlockValues_[std::make_pair(name, idx)] = data;
|
||||
}
|
||||
}
|
||||
|
||||
// unpack all data associated with link
|
||||
@ -393,9 +421,10 @@ namespace Ewoms
|
||||
};
|
||||
|
||||
// gather solution to rank 0 for EclipseWriter
|
||||
void collect( const Opm::data::Solution& localCellData )
|
||||
void collect( const Opm::data::Solution& localCellData, const std::map<std::pair<std::string, int>, double>& localBlockValues)
|
||||
{
|
||||
globalCellData_ = {};
|
||||
globalBlockValues_.clear();
|
||||
// index maps only have to be build when reordering is needed
|
||||
if( ! needsReordering && ! isParallel() )
|
||||
{
|
||||
@ -406,6 +435,8 @@ namespace Ewoms
|
||||
PackUnPack
|
||||
packUnpack( localCellData,
|
||||
globalCellData_,
|
||||
localBlockValues,
|
||||
globalBlockValues_,
|
||||
localIndexMap_,
|
||||
indexMaps_,
|
||||
numCells(),
|
||||
@ -426,6 +457,11 @@ namespace Ewoms
|
||||
#endif
|
||||
}
|
||||
|
||||
const std::map<std::pair<std::string, int>, double>& globalBlockValues() const
|
||||
{
|
||||
return globalBlockValues_;
|
||||
}
|
||||
|
||||
const Opm::data::Solution& globalCellData() const
|
||||
{
|
||||
return globalCellData_;
|
||||
@ -472,6 +508,7 @@ namespace Ewoms
|
||||
IndexMapStorageType indexMaps_;
|
||||
std::vector<int> globalRanks_;
|
||||
Opm::data::Solution globalCellData_;
|
||||
std::map<std::pair<std::string, int>, double> globalBlockValues_;
|
||||
};
|
||||
|
||||
} // end namespace Opm
|
||||
|
@ -117,47 +117,9 @@ public:
|
||||
if (!std::is_same<Discretization, Ewoms::EcfvDiscretization<TypeTag> >::value)
|
||||
return;
|
||||
|
||||
std::map<std::string, int> rstKeywords = restartConfig.getRestartKeywords(reportStepNum);
|
||||
for (auto& keyValue : rstKeywords) {
|
||||
keyValue.second = restartConfig.getKeyword(keyValue.first, reportStepNum);
|
||||
}
|
||||
|
||||
// Summary output is for all steps
|
||||
const Opm::SummaryConfig summaryConfig = simulator_.gridManager().summaryConfig();
|
||||
|
||||
for (unsigned phaseIdx = 0; phaseIdx < numPhases; ++ phaseIdx) {
|
||||
if (!FluidSystem::phaseIsActive(phaseIdx))
|
||||
continue;
|
||||
|
||||
if (!substep || (phaseIdx == waterPhaseIdx && summaryConfig.require3DField("SWAT") )
|
||||
|| (phaseIdx == gasPhaseIdx && summaryConfig.require3DField("SGAS") ) )
|
||||
saturation_[phaseIdx].resize(bufferSize,0.0);
|
||||
}
|
||||
|
||||
if (!substep || summaryConfig.require3DField("PRESSURE"))
|
||||
oilPressure_.resize(bufferSize,0.0);
|
||||
|
||||
if (!substep || summaryConfig.require3DField("TEMP"))
|
||||
temperature_.resize(bufferSize,0.0);
|
||||
|
||||
// Output the same as legacy
|
||||
// TODO: Only needed if DISGAS or VAPOIL
|
||||
if (true) {
|
||||
if (!substep || summaryConfig.require3DField("RS"))
|
||||
rs_.resize(bufferSize,0.0);
|
||||
}
|
||||
if (true) {
|
||||
if (!substep || summaryConfig.require3DField("RV"))
|
||||
rv_.resize(bufferSize,0.0);
|
||||
}
|
||||
|
||||
if (GET_PROP_VALUE(TypeTag, EnableSolvent)) {
|
||||
if (!substep || summaryConfig.require3DField("SSOL"))
|
||||
sSol_.resize(bufferSize,0.0);
|
||||
}
|
||||
if (GET_PROP_VALUE(TypeTag, EnablePolymer)) {
|
||||
if (!substep || summaryConfig.require3DField("POLYMER"))
|
||||
cPolymer_.resize(bufferSize,0.0);
|
||||
}
|
||||
blockValues_.clear();
|
||||
|
||||
// Fluid in place
|
||||
for (int i = 0; i<FIPDataType::numFipValues; i++) {
|
||||
@ -172,7 +134,42 @@ public:
|
||||
pPvHydrocarbon_.resize(bufferSize, 0.0);
|
||||
}
|
||||
|
||||
if (!substep) {
|
||||
outputRestart_ = false;
|
||||
// Only provide restart on restart steps
|
||||
if (!restartConfig.getWriteRestartFile(reportStepNum) || substep)
|
||||
return;
|
||||
|
||||
outputRestart_ = true;
|
||||
|
||||
for (unsigned phaseIdx = 0; phaseIdx < numPhases; ++ phaseIdx) {
|
||||
if (!FluidSystem::phaseIsActive(phaseIdx))
|
||||
continue;
|
||||
|
||||
saturation_[phaseIdx].resize(bufferSize,0.0);
|
||||
}
|
||||
|
||||
oilPressure_.resize(bufferSize,0.0);
|
||||
|
||||
if (true)
|
||||
temperature_.resize(bufferSize,0.0);
|
||||
|
||||
// Output the same as legacy
|
||||
// TODO: Only needed if DISGAS or VAPOIL
|
||||
if (true) {
|
||||
rs_.resize(bufferSize,0.0);
|
||||
}
|
||||
if (true) {
|
||||
rv_.resize(bufferSize,0.0);
|
||||
}
|
||||
|
||||
if (GET_PROP_VALUE(TypeTag, EnableSolvent)) {
|
||||
sSol_.resize(bufferSize,0.0);
|
||||
}
|
||||
if (GET_PROP_VALUE(TypeTag, EnablePolymer)) {
|
||||
cPolymer_.resize(bufferSize,0.0);
|
||||
}
|
||||
|
||||
if (true) {
|
||||
// Output the same as legacy
|
||||
// TODO: Only needed if Vappars or hysteresis.
|
||||
soMax_.resize(bufferSize,0.0);
|
||||
@ -182,9 +179,11 @@ public:
|
||||
krnSwMdcGo_.resize(bufferSize,0.0);
|
||||
}
|
||||
|
||||
// Only provide RESTART_AUXILIARY if it is asked for by the user
|
||||
if (!restartConfig.getWriteRestartFile(reportStepNum) || substep)
|
||||
return;
|
||||
// Only output RESTART_AUXILIARY asked for by the user.
|
||||
std::map<std::string, int> rstKeywords = restartConfig.getRestartKeywords(reportStepNum);
|
||||
for (auto& keyValue : rstKeywords) {
|
||||
keyValue.second = restartConfig.getKeyword(keyValue.first, reportStepNum);
|
||||
}
|
||||
|
||||
// Output the same as legacy
|
||||
// TODO: Only needed if DISGAS or VAPOIL
|
||||
@ -299,6 +298,7 @@ public:
|
||||
if (!std::is_same<Discretization, Ewoms::EcfvDiscretization<TypeTag> >::value)
|
||||
return;
|
||||
|
||||
const Opm::SummaryConfig& summaryConfig = simulator_.gridManager().summaryConfig();
|
||||
for (unsigned dofIdx = 0; dofIdx < elemCtx.numPrimaryDof(/*timeIdx=*/0); ++dofIdx) {
|
||||
const auto& intQuants = elemCtx.intensiveQuantities(dofIdx, /*timeIdx=*/0);
|
||||
const auto& fs = intQuants.fluidState();
|
||||
@ -562,8 +562,24 @@ public:
|
||||
fip_[FIPDataType::GasInPlace][globalDofIdx] += gipl;
|
||||
}
|
||||
|
||||
// Adding block values
|
||||
const auto globalIdx = elemCtx.simulator().gridManager().grid().globalCell()[globalDofIdx];
|
||||
for( const auto& node : summaryConfig ) {
|
||||
if (node.type() == ECL_SMSPEC_BLOCK_VAR) {
|
||||
int global_index = node.num() - 1;
|
||||
std::pair<std::string, int> key = std::make_pair(node.keyword(), node.num());
|
||||
if (global_index == globalIdx) {
|
||||
if (strcmp(node.keyword(),"BGSAT")) {
|
||||
blockValues_[key] = Toolbox::value(fs.saturation(waterPhaseIdx));
|
||||
} else if (strcmp(node.keyword(),"BWSAT")) {
|
||||
blockValues_[key] = Toolbox::value(fs.saturation(gasPhaseIdx));
|
||||
} else if (strcmp(node.keyword(),"BPR")) {
|
||||
blockValues_[key] = Toolbox::value(fs.pressure(oilPhaseIdx));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -989,6 +1005,14 @@ public:
|
||||
return 0;
|
||||
}
|
||||
|
||||
const std::map<std::pair<std::string, int>, double>& getBlockValues() {
|
||||
return blockValues_;
|
||||
}
|
||||
|
||||
const bool outputRestart() const {
|
||||
return outputRestart_;
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
|
||||
@ -1055,6 +1079,7 @@ private:
|
||||
Scalar pvHydrocarbonSum = 0.0;
|
||||
size_t numElem = pPv_.size();
|
||||
for (size_t elem = 0; elem < numElem; ++elem) {
|
||||
//ignore ghost cells (all ghost cells has fipnum == 0)
|
||||
if(static_cast<int>(fipnum_[elem]) == reg || (-1 == reg && fipnum_[elem] > 0) )
|
||||
{
|
||||
pPvSum += pPv_[elem];;
|
||||
@ -1111,8 +1136,6 @@ private:
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void outputRegionFluidInPlace_(const ScalarBuffer& oip, const ScalarBuffer& cip, const Scalar& pav, const int reg)
|
||||
{
|
||||
const Opm::UnitSystem& units = simulator_.gridManager().eclState().getUnits();
|
||||
@ -1175,6 +1198,8 @@ private:
|
||||
|
||||
const Simulator& simulator_;
|
||||
|
||||
bool outputRestart_;
|
||||
|
||||
ScalarBuffer saturation_[numPhases];
|
||||
ScalarBuffer oilPressure_;
|
||||
ScalarBuffer temperature_;
|
||||
@ -1208,7 +1233,7 @@ private:
|
||||
ScalarBuffer pvHydrocarbon_;
|
||||
ScalarBuffer pPv_;
|
||||
ScalarBuffer pPvHydrocarbon_;
|
||||
|
||||
std::map<std::pair<std::string, int>, double> blockValues_;
|
||||
};
|
||||
} // namespace Ewoms
|
||||
|
||||
|
@ -154,11 +154,12 @@ public:
|
||||
|
||||
// collect all data to I/O rank and assign to sol
|
||||
Opm::data::Solution localCellData;
|
||||
eclOutputModule_.assignToSolution(localCellData);
|
||||
if (collectToIORank_.isParallel())
|
||||
collectToIORank_.collect(localCellData);
|
||||
if (eclOutputModule_.outputRestart())
|
||||
eclOutputModule_.assignToSolution(localCellData);
|
||||
|
||||
if (collectToIORank_.isParallel())
|
||||
collectToIORank_.collect(localCellData, eclOutputModule_.getBlockValues());
|
||||
|
||||
//if (!substep)
|
||||
std::map<std::string, double> miscSummaryData;
|
||||
std::map<std::string, std::vector<double>> regionData;
|
||||
eclOutputModule_.outputFIPLog(miscSummaryData, regionData, substep);
|
||||
@ -169,7 +170,7 @@ public:
|
||||
std::map<std::string, std::vector<double>> extraRestartData;
|
||||
|
||||
// Add suggested next timestep to extra data.
|
||||
if (!substep)
|
||||
if (eclOutputModule_.outputRestart())
|
||||
extraRestartData["OPMEXTRA"] = std::vector<double>(1, nextstep);
|
||||
|
||||
// Add TCPU
|
||||
@ -178,6 +179,8 @@ public:
|
||||
}
|
||||
bool enableDoublePrecisionOutput = false; //EWOMS_GET_PARAM(TypeTag, bool, EclOutputDoublePrecision);
|
||||
const Opm::data::Solution& cellData = collectToIORank_.isParallel() ? collectToIORank_.globalCellData() : localCellData;
|
||||
const std::map<std::pair<std::string, int>, double>& blockValues = collectToIORank_.isParallel() ? collectToIORank_.globalBlockValues() : eclOutputModule_.getBlockValues();
|
||||
|
||||
eclIO_->writeTimeStep(episodeIdx,
|
||||
substep,
|
||||
t,
|
||||
@ -185,6 +188,7 @@ public:
|
||||
dw,
|
||||
miscSummaryData,
|
||||
regionData,
|
||||
blockValues,
|
||||
extraRestartData,
|
||||
enableDoublePrecisionOutput);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user