78class GenericOutputBlackoilModule {
80 using Scalar =
typename FluidSystem::Scalar;
83 virtual ~GenericOutputBlackoilModule();
90 void outputTimeStamp(
const std::string& lbl,
93 boost::posix_time::ptime currentDate);
104 void outputCumLog(std::size_t reportStepNum,
105 const bool connData);
108 void outputProdLog(std::size_t reportStepNum,
109 const bool connData);
112 void outputInjLog(std::size_t reportStepNum,
113 const bool connData);
116 void outputMSWLog(std::size_t reportStepNum);
119 void calc_initial_inplace(
const Parallel::Communication& comm);
122 Inplace calc_inplace(std::map<std::string, double>& miscSummaryData,
123 std::map<std::string, std::vector<double>>& regionData,
124 const Parallel::Communication& comm);
147 const bool changedWellLists,
148 const std::size_t reportStepNum,
149 const double elapsed,
150 boost::posix_time::ptime currentDate)
const;
152 void outputErrorLog(
const Parallel::Communication& comm)
const;
154 void addRftDataToWells(data::Wells& wellDatas,
155 std::size_t reportStepNum,
156 const Parallel::Communication& comm)
157 { this->rftC_.addToWells(wellDatas, reportStepNum, comm); }
164 void setRestart(
const data::Solution& sol,
166 unsigned globalDofIndex);
168 Scalar getSolventSaturation(
unsigned elemIdx)
const
170 if (sSol_.size() > elemIdx)
171 return sSol_[elemIdx];
176 Scalar getSolventRsw(
unsigned elemIdx)
const
178 if (rswSol_.size() > elemIdx)
179 return rswSol_[elemIdx];
184 Scalar getPolymerConcentration(
unsigned elemIdx)
const
186 if (cPolymer_.size() > elemIdx)
187 return cPolymer_[elemIdx];
192 Scalar getFoamConcentration(
unsigned elemIdx)
const
194 if (cFoam_.size() > elemIdx)
195 return cFoam_[elemIdx];
200 Scalar getSaltConcentration(
unsigned elemIdx)
const
202 if (cSalt_.size() > elemIdx)
203 return cSalt_[elemIdx];
208 Scalar getSaltSaturation(
unsigned elemIdx)
const
210 if (pSalt_.size() > elemIdx)
211 return pSalt_[elemIdx];
216 Scalar getPermFactor(
unsigned elemIdx)
const
218 if (permFact_.size() > elemIdx)
219 return permFact_[elemIdx];
224 const std::vector<Scalar>& getFluidPressure()
const
225 {
return fluidPressure_; }
228 {
return this->bioeffectsC_; }
231 {
return this->CO2H2C_; }
234 {
return this->flowsC_; }
236 bool needInterfaceFluxes([[maybe_unused]]
const bool isSubStep)
const
238 return this->interRegionFlows_.wantInterRegflowSummary();
241 const std::map<std::pair<std::string, int>,
double>& getBlockData()
246 std::map<std::pair<std::string, int>,
double>& getExtraBlockData()
248 return extraBlockData_;
251 const Inplace* initialInplace()
const
253 return this->initialInplace_.has_value()
254 ? &*this->initialInplace_
258 bool localDataValid()
const{
259 return local_data_valid_;
262 void invalidateLocalData(){
263 local_data_valid_ =
false;
266 void validateLocalData(){
267 local_data_valid_ =
true;
270 template<
class Serializer>
271 void serializeOp(Serializer& serializer)
273 serializer(initialInplace_);
289 using ScalarBuffer = std::vector<Scalar>;
290 using StringBuffer = std::vector<std::string>;
291 enum { numPhases = FluidSystem::numPhases };
292 enum { numComponents = FluidSystem::numComponents };
293 static constexpr int gasPhaseIdx = FluidSystem::gasPhaseIdx;
294 static constexpr int oilPhaseIdx = FluidSystem::oilPhaseIdx;
295 static constexpr int waterPhaseIdx = FluidSystem::waterPhaseIdx;
296 enum { gasCompIdx = FluidSystem::gasCompIdx };
297 enum { oilCompIdx = FluidSystem::oilCompIdx };
298 enum { waterCompIdx = FluidSystem::waterCompIdx };
299 using Dir = FaceDir::DirEnum;
301 GenericOutputBlackoilModule(
const EclipseState& eclState,
302 const Schedule& schedule,
303 const SummaryConfig& summaryConfig,
304 const SummaryState& summaryState,
306 RSTConv::LocalToGlobalCellFunc globalCell,
307 std::function<
bool(
const unsigned)> isInterior,
308 const Parallel::Communication& comm,
310 bool constantTemperature,
316 bool enableSaltPrecipitation,
318 bool enableBioeffects,
319 bool enableGeochemistry);
321 void doAllocBuffers(
unsigned bufferSize,
322 unsigned reportStepNum,
325 const bool isRestart,
326 const EclHysteresisConfig* hysteresisConfig,
327 unsigned numOutputNnc = 0,
328 std::map<std::string, int> rstKeywords = {});
330 void makeRegionSum(Inplace& inplace,
331 const std::string& region_name,
332 const Parallel::Communication& comm)
const;
334 Inplace accumulateRegionSums(
const Parallel::Communication& comm);
336 void updateSummaryRegionValues(
const Inplace& inplace,
337 std::map<std::string, double>& miscSummaryData,
338 std::map<std::string, std::vector<double>>& regionData)
const;
340 static bool isOutputCreationDirective_(
const std::string& keyword);
343 static ScalarBuffer regionSum(
const ScalarBuffer& property,
344 const std::vector<int>& regionId,
345 const std::size_t maxNumberOfRegions,
346 const Parallel::Communication& comm);
348 static int regionMax(
const std::vector<int>& region,
349 const Parallel::Communication& comm);
351 static void update(Inplace& inplace,
352 const std::string& region_name,
353 const Inplace::Phase phase,
354 const std::size_t ntFip,
355 const ScalarBuffer& values);
357 static Scalar sum(
const ScalarBuffer& v);
359 void setupBlockData(std::function<
bool(
int)> isCartIdxOnThisRank);
360 void setupExtraBlockData(
const std::size_t reportStepNum,
361 std::function<
bool(
int)> isCartIdxOnThisRank);
363 virtual bool isDefunctParallelWell(
const std::string& wname)
const = 0;
364 virtual bool isOwnedByCurrentRank(
const std::string& wname)
const = 0;
365 virtual bool isOnCurrentRank(
const std::string& wname)
const = 0;
367 const EclipseState& eclState_;
368 const Schedule& schedule_;
369 const SummaryState& summaryState_;
371 SummaryConfig summaryConfig_;
376 bool enableEnergy_{
false};
377 bool constantTemperature_{
false};
378 bool enableMech_{
false};
380 bool enableSolvent_{
false};
381 bool enablePolymer_{
false};
382 bool enableFoam_{
false};
383 bool enableBrine_{
false};
384 bool enableSaltPrecipitation_{
false};
385 bool enableExtbo_{
false};
386 bool enableBioeffects_{
false};
387 bool enableGeochemistry_{
false};
389 bool forceDisableFipOutput_{
false};
390 bool forceDisableFipresvOutput_{
false};
391 bool computeFip_{
false};
394 std::unordered_map<std::string, std::vector<int>> regions_;
395 std::unordered_map<Inplace::Phase, std::vector<SummaryConfigNode>> regionNodes_;
397 std::vector<SummaryConfigNode> RPRNodes_;
398 std::vector<SummaryConfigNode> RPRPNodes_;
400 std::vector<int> failedCellsPb_;
401 std::vector<int> failedCellsPd_;
403 ScalarBuffer gasFormationVolumeFactor_;
404 ScalarBuffer hydrocarbonPoreVolume_;
405 ScalarBuffer pressureTimesPoreVolume_;
406 ScalarBuffer pressureTimesHydrocarbonVolume_;
407 ScalarBuffer dynamicPoreVolume_;
409 ScalarBuffer fluidPressure_;
410 ScalarBuffer temperature_;
415 ScalarBuffer overburdenPressure_;
416 ScalarBuffer oilSaturationPressure_;
417 ScalarBuffer drsdtcon_;
419 ScalarBuffer rswSol_;
420 ScalarBuffer cPolymer_;
424 ScalarBuffer permFact_;
433 ScalarBuffer gasDissolutionFactor_;
434 ScalarBuffer oilVaporizationFactor_;
435 ScalarBuffer gasDissolutionFactorInWater_;
436 ScalarBuffer waterVaporizationFactor_;
437 ScalarBuffer bubblePointPressure_;
438 ScalarBuffer dewPointPressure_;
439 ScalarBuffer rockCompPorvMultiplier_;
440 ScalarBuffer minimumOilPressure_;
441 ScalarBuffer saturatedOilFormationVolumeFactor_;
442 ScalarBuffer rockCompTransMultiplier_;
452 std::array<ScalarBuffer, numPhases> saturation_;
453 std::array<ScalarBuffer, numPhases> invB_;
454 std::array<ScalarBuffer, numPhases> density_;
455 std::array<ScalarBuffer, numPhases> viscosity_;
456 std::array<ScalarBuffer, numPhases> relativePermeability_;
462 std::array<ScalarBuffer, numPhases> residual_;
469 std::map<std::pair<std::string, int>,
double> blockData_;
472 std::map<std::pair<std::string, int>,
double> extraBlockData_;
474 std::optional<Inplace> initialInplace_;
475 bool local_data_valid_{
false};
477 std::optional<RegionPhasePoreVolAverage> regionAvgDensity_;