mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
Remove Dashed Lines Between Records in PRT File Reports
This commit splits the production, injection, and cumulative *Report_() functions into three logically distinct parts, one for outputting the report header (begin*Report_()), one for outputting a single report record (output*ReportRecord_()), and one for ending the report (end*Report_()). This simplifies the logic of the *Record_() member functions since they no longer need to infer the context which is already available in the caller and can perform a more narrow task than before. With this separation we're also able to remove the dashed lines which would previously separate each report record, thereby creating PRT file report sheets which have a more expected layout. Moreover, as an aid to future maintenance, we also factor out common code for the well and group cases in each *Record_() function. Finally, fix a unit conversion problem in the report values for cumulative gas quantities. The sheet header states that we should be outputting values in 'MM' prefixed units, but we were only scaling the gas values by a factor of 1000 instead of 1000*1000. In other words, the injection and production gas values in the cumulative sheet were off by a factor of 1000.
This commit is contained in:
parent
f9a5b1ecdb
commit
c03f794f9c
@ -94,9 +94,10 @@ void LogOutputHelper<Scalar>::
|
||||
cumulative(const std::size_t reportStepNum,
|
||||
std::function<bool(const std::string&)> isDefunct) const
|
||||
{
|
||||
this->beginCumulativeReport_();
|
||||
|
||||
std::vector<Scalar> tmp_values(WellCumDataType::numWCValues, 0.0);
|
||||
std::vector<std::string> tmp_names(WellCumDataType::numWCNames, "");
|
||||
this->outputCumulativeReport_(tmp_values, tmp_names);
|
||||
|
||||
const auto& st = summaryState_;
|
||||
for (const auto& gname : schedule_.groupNames()) {
|
||||
@ -129,7 +130,7 @@ cumulative(const std::size_t reportStepNum,
|
||||
tmp_values[9] = get("GVIT"); // WellCumDataType::FluidResVolInj
|
||||
}
|
||||
|
||||
this->outputCumulativeReport_(tmp_values, tmp_names);
|
||||
this->outputCumulativeReportRecord_(tmp_values, tmp_names);
|
||||
}
|
||||
|
||||
for (const auto& wname : schedule_.wellNames(reportStepNum)) {
|
||||
@ -225,8 +226,10 @@ cumulative(const std::size_t reportStepNum,
|
||||
tmp_values[8] = get("WGIT"); // WellCumDataType::GasInj
|
||||
tmp_values[9] = get("WVIT"); // WellCumDataType::FluidResVolInj
|
||||
|
||||
this->outputCumulativeReport_(tmp_values, tmp_names);
|
||||
this->outputCumulativeReportRecord_(tmp_values, tmp_names);
|
||||
}
|
||||
|
||||
this->endCumulativeReport_();
|
||||
}
|
||||
|
||||
template<class Scalar>
|
||||
@ -336,9 +339,10 @@ void LogOutputHelper<Scalar>::
|
||||
injection(const std::size_t reportStepNum,
|
||||
std::function<bool(const std::string&)> isDefunct) const
|
||||
{
|
||||
this->beginInjectionReport_();
|
||||
|
||||
std::vector<Scalar> tmp_values(WellInjDataType::numWIValues, 0.0);
|
||||
std::vector<std::string> tmp_names(WellInjDataType::numWINames, "");
|
||||
this->outputInjectionReport_(tmp_values, tmp_names);
|
||||
|
||||
const auto& st = summaryState_;
|
||||
for (const auto& gname : schedule_.groupNames()) {
|
||||
@ -362,7 +366,7 @@ injection(const std::size_t reportStepNum,
|
||||
tmp_values[5] = get("GVIR"); // WellInjDataType::FluidResVol
|
||||
}
|
||||
|
||||
this->outputInjectionReport_(tmp_values, tmp_names);
|
||||
this->outputInjectionReportRecord_(tmp_values, tmp_names);
|
||||
}
|
||||
|
||||
for (const auto& wname : schedule_.wellNames(reportStepNum)) {
|
||||
@ -450,8 +454,10 @@ injection(const std::size_t reportStepNum,
|
||||
tmp_values[7] = get("WTHP"); // WellInjDataType::THP
|
||||
//tmp_values[8] = 0; // WellInjDataType::SteadyStateII
|
||||
|
||||
this->outputInjectionReport_(tmp_values, tmp_names);
|
||||
this->outputInjectionReportRecord_(tmp_values, tmp_names);
|
||||
}
|
||||
|
||||
this->endInjectionReport_();
|
||||
}
|
||||
|
||||
template<class Scalar>
|
||||
@ -459,9 +465,10 @@ void LogOutputHelper<Scalar>::
|
||||
production(const std::size_t reportStepNum,
|
||||
std::function<bool(const std::string&)> isDefunct) const
|
||||
{
|
||||
this->beginProductionReport_();
|
||||
|
||||
std::vector<Scalar> tmp_values(WellProdDataType::numWPValues, 0.0);
|
||||
std::vector<std::string> tmp_names(WellProdDataType::numWPNames, "");
|
||||
this->outputProductionReport_(tmp_values, tmp_names);
|
||||
|
||||
const auto& st = summaryState_;
|
||||
for (const auto& gname : schedule_.groupNames()) {
|
||||
@ -494,7 +501,7 @@ production(const std::size_t reportStepNum,
|
||||
tmp_values[8] = 0.0;
|
||||
}
|
||||
|
||||
this->outputProductionReport_(tmp_values, tmp_names);
|
||||
this->outputProductionReportRecord_(tmp_values, tmp_names);
|
||||
}
|
||||
|
||||
for (const auto& wname : schedule_.wellNames(reportStepNum)) {
|
||||
@ -559,181 +566,237 @@ production(const std::size_t reportStepNum,
|
||||
tmp_values[8] = 0.0;
|
||||
}
|
||||
|
||||
this->outputProductionReport_(tmp_values, tmp_names);
|
||||
this->outputProductionReportRecord_(tmp_values, tmp_names);
|
||||
}
|
||||
|
||||
this->endProductionReport_();
|
||||
}
|
||||
|
||||
template <typename Scalar>
|
||||
void LogOutputHelper<Scalar>::beginCumulativeReport_() const
|
||||
{
|
||||
const auto unitType = this->eclState_.getUnits().getType();
|
||||
|
||||
std::ostringstream ss;
|
||||
|
||||
ss << "\n=================================================== CUMULATIVE PRODUCTION/INJECTION REPORT =========================================\n"
|
||||
<< ": WELL : LOCATION : WELL :CTRL: OIL : WATER : GAS : Prod : OIL : WATER : GAS : INJ :\n"
|
||||
<< ": NAME : (I,J,K) : TYPE :MODE: PROD : PROD : PROD : RES.VOL. : INJ : INJ : INJ : RES.VOL. :\n";
|
||||
|
||||
if (unitType == UnitSystem::UnitType::UNIT_TYPE_METRIC) {
|
||||
ss << ": : : : : MSCM : MSCM : MMSCM : MRCM : MSCM : MSCM : MMSCM : MRCM :\n";
|
||||
} else if (unitType == UnitSystem::UnitType::UNIT_TYPE_FIELD) {
|
||||
ss << ": : : : : MSTB : MSTB : MMSCF : MRB : MSTB : MSTB : MMSCF : MRB :\n";
|
||||
} else if (unitType == UnitSystem::UnitType::UNIT_TYPE_LAB) {
|
||||
ss << ": : : : : MSCC : MSCC : MMSCC : MRCC : MSCC : MSCC : MMSCC : MRCC :\n";
|
||||
}
|
||||
|
||||
ss << "====================================================================================================================================";
|
||||
|
||||
OpmLog::note(ss.str());
|
||||
}
|
||||
|
||||
template <typename Scalar>
|
||||
void LogOutputHelper<Scalar>::endCumulativeReport_() const
|
||||
{
|
||||
const auto ss = std::string { ":--------:-----------:--------:----:-----------:-----------:-----------:-----------:-----------:-----------:-----------:-----------:" };
|
||||
|
||||
OpmLog::note(ss);
|
||||
}
|
||||
|
||||
template<class Scalar>
|
||||
void LogOutputHelper<Scalar>::
|
||||
outputCumulativeReport_(const std::vector<Scalar>& wellCum,
|
||||
const std::vector<std::string>& wellCumNames) const
|
||||
outputCumulativeReportRecord_(const std::vector<Scalar>& wellCum,
|
||||
const std::vector<std::string>& wellCumNames) const
|
||||
{
|
||||
const UnitSystem& units = eclState_.getUnits();
|
||||
std::ostringstream ss;
|
||||
if (wellCumNames[WellCumDataType::WellName].empty()) {
|
||||
ss << "\n=================================================== CUMULATIVE PRODUCTION/INJECTION REPORT =========================================\n"
|
||||
<< ": WELL : LOCATION : WELL :CTRL: OIL : WATER : GAS : Prod : OIL : WATER : GAS : INJ :\n"
|
||||
<< ": NAME : (I,J,K) : TYPE :MODE: PROD : PROD : PROD : RES.VOL. : INJ : INJ : INJ : RES.VOL. :\n";
|
||||
if (units.getType() == UnitSystem::UnitType::UNIT_TYPE_METRIC) {
|
||||
ss << ": : : : : MSCM : MSCM : MMSCM : MRCM : MSCM : MSCM : MMSCM : MRCM :\n";
|
||||
} else if (units.getType() == UnitSystem::UnitType::UNIT_TYPE_FIELD) {
|
||||
ss << ": : : : : MSTB : MSTB : MMSCF : MRB : MSTB : MSTB : MMSCF : MRB :\n";
|
||||
} else if (units.getType() == UnitSystem::UnitType::UNIT_TYPE_LAB) {
|
||||
ss << ": : : : : MSCC : MSCC : MMSCC : MRCC : MSCC : MSCC : MMSCC : MRCC :\n";
|
||||
ss << ":--------:-----------:--------:----:-----------:-----------:-----------:-----------:------------:----------:-----------:-----------:";
|
||||
}
|
||||
ss << "====================================================================================================================================";
|
||||
|
||||
ss << std::right << std::fixed << std::setprecision(0) << ':'
|
||||
<< std::setw(8) << wellCumNames[WellCumDataType::WellName] << ':';
|
||||
|
||||
if (wellCum[WellCumDataType::WellLocationi] < 1) {
|
||||
ss << std::setw(11) << "" << ':';
|
||||
} else {
|
||||
if (wellCum[WellCumDataType::WellLocationi] < 1) {
|
||||
ss << std::right << std::fixed << std::setprecision(0) << ":" << std::setw (8)
|
||||
<< wellCumNames[WellCumDataType::WellName] << ":"
|
||||
<< std::setw(11) << "" << ":"
|
||||
<< std::setw(8) << wellCumNames[WellCumDataType::WellType] << ":"
|
||||
<< std::setw(4) << wellCumNames[WellCumDataType::WellCTRL] << ":"
|
||||
<< std::setprecision(1) << std::setw(11) << wellCum[WellCumDataType::OilProd] / 1000.0 << ":"
|
||||
<< std::setw(11) << wellCum[WellCumDataType::WaterProd] / 1000.0 << ":"
|
||||
<< std::setw(11)<< wellCum[WellCumDataType::GasProd] / 1000.0 << ":"
|
||||
<< std::setw(11) << wellCum[WellCumDataType::FluidResVolProd] / 1000.0 << ":"
|
||||
<< std::setw(11) << wellCum[WellCumDataType::OilInj] / 1000.0 << ":"
|
||||
<< std::setw(11) << wellCum[WellCumDataType::WaterInj] / 1000.0 << ":"
|
||||
<< std::setw(11) << wellCum[WellCumDataType::GasInj] / 1000.0 << ":"
|
||||
<< std::setw(11) << wellCum[WellCumDataType::FluidResVolInj] / 1000.0 << ": \n";
|
||||
} else {
|
||||
ss << std::right << std::fixed << std::setprecision(0) << ":"
|
||||
<< std::setw (8) << wellCumNames[WellCumDataType::WellName] << ":"
|
||||
<< std::setw(5) << wellCum[WellCumDataType::WellLocationi] << ","
|
||||
<< std::setw(5) << wellCum[WellCumDataType::WellLocationj] << ":"
|
||||
<< std::setw(8) << wellCumNames[WellCumDataType::WellType] << ":"
|
||||
<< std::setw(4) << wellCumNames[WellCumDataType::WellCTRL] << ":"
|
||||
<< std::setprecision(1) << std::setw(11) << wellCum[WellCumDataType::OilProd] / 1000.0 << ":"
|
||||
<< std::setw(11) << wellCum[WellCumDataType::WaterProd] / 1000.0 << ":"
|
||||
<< std::setw(11)<< wellCum[WellCumDataType::GasProd] / 1000.0 << ":"
|
||||
<< std::setw(11) << wellCum[WellCumDataType::FluidResVolProd] / 1000.0 << ":"
|
||||
<< std::setw(11) << wellCum[WellCumDataType::OilInj] / 1000.0 << ":"
|
||||
<< std::setw(11) << wellCum[WellCumDataType::WaterInj] / 1000.0 << ":"
|
||||
<< std::setw(11) << wellCum[WellCumDataType::GasInj] / 1000.0 << ":"
|
||||
<< std::setw(11) << wellCum[WellCumDataType::FluidResVolInj] / 1000.0 << ": \n";
|
||||
}
|
||||
ss << ":--------:-----------:--------:----:-----------:-----------:-----------:-----------:------------:----------:-----------:-----------:";
|
||||
ss << std::setw( 5) << wellCum[WellCumDataType::WellLocationi] << ','
|
||||
<< std::setw( 5) << wellCum[WellCumDataType::WellLocationj] << ':';
|
||||
}
|
||||
|
||||
auto scaledValue = [&wellCum](const typename WellCumDataType::WCId quantity)
|
||||
{
|
||||
// Unit M*
|
||||
return wellCum[quantity] / 1000.0;
|
||||
};
|
||||
|
||||
auto scaledGasValue = [&wellCum](const typename WellCumDataType::WCId quantity)
|
||||
{
|
||||
// Unit MM*
|
||||
return wellCum[quantity] / (1000.0 * 1000.0);
|
||||
};
|
||||
|
||||
ss << std::setw( 8) << wellCumNames[WellCumDataType::WCId::WellType] << ':'
|
||||
<< std::setw( 4) << wellCumNames[WellCumDataType::WCId::WellCTRL] << ':' << std::setprecision(1)
|
||||
<< std::setw(11) << scaledValue(WellCumDataType::WCId::OilProd) << ':'
|
||||
<< std::setw(11) << scaledValue(WellCumDataType::WCId::WaterProd) << ':'
|
||||
<< std::setw(11) << scaledGasValue(WellCumDataType::WCId::GasProd) << ':'
|
||||
<< std::setw(11) << scaledValue(WellCumDataType::WCId::FluidResVolProd) << ':'
|
||||
<< std::setw(11) << scaledValue(WellCumDataType::WCId::OilInj) << ':'
|
||||
<< std::setw(11) << scaledValue(WellCumDataType::WCId::WaterInj) << ':'
|
||||
<< std::setw(11) << scaledGasValue(WellCumDataType::WCId::GasInj) << ':'
|
||||
<< std::setw(11) << scaledValue(WellCumDataType::WCId::FluidResVolInj) << ':';
|
||||
|
||||
OpmLog::note(ss.str());
|
||||
}
|
||||
|
||||
template <typename Scalar>
|
||||
void LogOutputHelper<Scalar>::beginInjectionReport_() const
|
||||
{
|
||||
const auto unitType = this->eclState_.getUnits().getType();
|
||||
|
||||
std::ostringstream ss;
|
||||
ss << "\n=================================================== INJECTION REPORT ========================================\n"//===================== \n"
|
||||
<< ": WELL : LOCATION : CTRL : CTRL : CTRL : OIL : WATER : GAS : FLUID : BHP OR : THP OR :\n"// STEADY-ST II :\n"
|
||||
<< ": NAME : (I,J,K) : MODE : MODE : MODE : RATE : RATE : RATE : RES.VOL. : CON.PR.: BLK.PR.:\n";// OR POTENTIAL :\n";
|
||||
|
||||
if (unitType == UnitSystem::UnitType::UNIT_TYPE_METRIC) {
|
||||
ss << ": : : OIL : WAT : GAS : SCM/DAY : SCM/DAY : SCM/DAY : RCM/DAY : BARSA : BARSA :\n";// :\n";
|
||||
} else if (unitType == UnitSystem::UnitType::UNIT_TYPE_FIELD) {
|
||||
ss << ": : : OIL : WAT : GAS : STB/DAY : STB/DAY : MSCF/DAY : RB/DAY : PSIA : PSIA :\n";// :\n";
|
||||
} else if (unitType == UnitSystem::UnitType::UNIT_TYPE_LAB) {
|
||||
ss << ": : : OIL : WAT : GAS : SCC/HR : SCC/HR : SCC/HR : RCC/HR : ATMA : ATMA :\n";// :\n";
|
||||
}
|
||||
|
||||
ss << "=============================================================================================================";//=====================";
|
||||
|
||||
OpmLog::note(ss.str());
|
||||
}
|
||||
|
||||
template <typename Scalar>
|
||||
void LogOutputHelper<Scalar>::endInjectionReport_() const
|
||||
{
|
||||
const auto ss = std::string { ":--------:-----------:------:------:------:-----------:-----------:-----------:-----------:--------:--------:" };
|
||||
|
||||
OpmLog::note(ss);
|
||||
}
|
||||
|
||||
template<class Scalar>
|
||||
void LogOutputHelper<Scalar>::
|
||||
outputInjectionReportRecord_(const std::vector<Scalar>& wellInj,
|
||||
const std::vector<std::string>& wellInjNames) const
|
||||
{
|
||||
const auto isWellRecord =
|
||||
wellInj[WellProdDataType::WellLocationi] >= 1;
|
||||
|
||||
std::ostringstream ss;
|
||||
|
||||
ss << std::right << std::fixed << std::setprecision(0) << ':'
|
||||
<< std::setw(8) << wellInjNames[WellInjDataType::WellName] << ':';
|
||||
|
||||
if (! isWellRecord) {
|
||||
ss << std::setw(11) << "" << ':';
|
||||
} else {
|
||||
ss << std::setw( 5) << wellInj[WellInjDataType::WellLocationi] << ','
|
||||
<< std::setw( 5) << wellInj[WellInjDataType::WellLocationj] << ':';
|
||||
}
|
||||
|
||||
ss << std::setw( 6) << wellInjNames[WellInjDataType::CTRLModeOil] << ':'
|
||||
<< std::setw( 6) << wellInjNames[WellInjDataType::CTRLModeWat] << ':'
|
||||
<< std::setw( 6) << wellInjNames[WellInjDataType::CTRLModeGas] << ':' << std::setprecision(1)
|
||||
<< std::setw(11) << wellInj[WellInjDataType::OilRate] << ':'
|
||||
<< std::setw(11) << wellInj[WellInjDataType::WaterRate] << ':'
|
||||
<< std::setw(11) << wellInj[WellInjDataType::GasRate] << ':'
|
||||
<< std::setw(11) << wellInj[WellInjDataType::FluidResVol] << ':';
|
||||
|
||||
if (! isWellRecord) {
|
||||
ss << std::setw(8) << "" << ':' << std::setw(8) << "" << ':'; //wellInj[WellInjDataType::SteadyStateII] << std::setw(10) << "\n"
|
||||
} else {
|
||||
ss << std::setw(8) << wellInj[WellInjDataType::BHP] << ':'
|
||||
<< std::setw(8) << wellInj[WellInjDataType::THP] << ':'; //wellInj[WellInjDataType::SteadyStateII] << std::setw(10) << "\n"
|
||||
}
|
||||
|
||||
OpmLog::note(ss.str());
|
||||
}
|
||||
|
||||
template <typename Scalar>
|
||||
void LogOutputHelper<Scalar>::beginProductionReport_() const
|
||||
{
|
||||
const auto unitType = this->eclState_.getUnits().getType();
|
||||
|
||||
std::ostringstream ss;
|
||||
ss << "\n======================================================= PRODUCTION REPORT =======================================================\n"//=================== \n"
|
||||
<< ": WELL : LOCATION :CTRL: OIL : WATER : GAS : FLUID : WATER : GAS/OIL : WAT/GAS : BHP OR : THP OR :\n"// STEADY-ST PI :\n"
|
||||
<< ": NAME : (I,J,K) :MODE: RATE : RATE : RATE : RES.VOL. : CUT : RATIO : RATIO : CON.PR.: BLK.PR.:\n";// OR POTN OF PREF. PH:\n";
|
||||
|
||||
if (unitType == UnitSystem::UnitType::UNIT_TYPE_METRIC) {
|
||||
ss << ": : : : SCM/DAY : SCM/DAY : SCM/DAY : RCM/DAY : SCM/SCM : SCM/SCM : SCM/SCM : BARSA : BARSA :\n";// :\n";
|
||||
} else if (unitType == UnitSystem::UnitType::UNIT_TYPE_FIELD) {
|
||||
ss << ": : : : STB/DAY : STB/DAY : MSCF/DAY : RB/DAY : : MSCF/STB : STB/MSCF : PSIA : PSIA :\n";// :\n";
|
||||
} else if (unitType == UnitSystem::UnitType::UNIT_TYPE_LAB) {
|
||||
ss << ": : : : SCC/HR : SCC/HR : SCC/HR : RCC : SCC/SCC : SCC/SCC : SCC/SCC : ATMA : ATMA :\n";// :\n";
|
||||
}
|
||||
|
||||
ss << "=================================================================================================================================";//===================";
|
||||
|
||||
OpmLog::note(ss.str());
|
||||
}
|
||||
|
||||
template <typename Scalar>
|
||||
void LogOutputHelper<Scalar>::endProductionReport_() const
|
||||
{
|
||||
std::ostringstream ss;
|
||||
|
||||
ss << ':' << std::setfill ('-') << std::setw (9) << ':'
|
||||
<< std::setfill ('-') << std::setw (12) << ':'
|
||||
<< std::setfill ('-') << std::setw ( 5) << ':'
|
||||
<< std::setfill ('-') << std::setw (12) << ':'
|
||||
<< std::setfill ('-') << std::setw (12) << ':'
|
||||
<< std::setfill ('-') << std::setw (12) << ':'
|
||||
<< std::setfill ('-') << std::setw (12) << ':'
|
||||
<< std::setfill ('-') << std::setw (12) << ':'
|
||||
<< std::setfill ('-') << std::setw (11) << ':'
|
||||
<< std::setfill ('-') << std::setw (13) << ':'
|
||||
<< std::setfill ('-') << std::setw ( 9) << ':'
|
||||
<< std::setfill ('-') << std::setw ( 9) << ':';
|
||||
|
||||
OpmLog::note(ss.str());
|
||||
}
|
||||
|
||||
template<class Scalar>
|
||||
void LogOutputHelper<Scalar>::
|
||||
outputInjectionReport_(const std::vector<Scalar>& wellInj,
|
||||
const std::vector<std::string>& wellInjNames) const
|
||||
outputProductionReportRecord_(const std::vector<Scalar>& wellProd,
|
||||
const std::vector<std::string>& wellProdNames) const
|
||||
{
|
||||
const UnitSystem& units = eclState_.getUnits();
|
||||
std::ostringstream ss;
|
||||
if (wellInjNames[WellInjDataType::WellName].empty()) {
|
||||
ss << "\n=================================================== INJECTION REPORT ========================================\n"//===================== \n"
|
||||
<< ": WELL : LOCATION : CTRL : CTRL : CTRL : OIL : WATER : GAS : FLUID : BHP OR : THP OR :\n"// STEADY-ST II :\n"
|
||||
<< ": NAME : (I,J,K) : MODE : MODE : MODE : RATE : RATE : RATE : RES.VOL. : CON.PR.: BLK.PR.:\n";// OR POTENTIAL :\n";
|
||||
if (units.getType() == UnitSystem::UnitType::UNIT_TYPE_METRIC) {
|
||||
ss << ": : : OIL : WAT : GAS : SCM/DAY : SCM/DAY : SCM/DAY : RCM/DAY : BARSA : BARSA :\n";// :\n";
|
||||
} else if (units.getType() == UnitSystem::UnitType::UNIT_TYPE_FIELD) {
|
||||
ss << ": : : OIL : WAT : GAS : STB/DAY : STB/DAY : MSCF/DAY : RB/DAY : PSIA : PSIA :\n";// :\n";
|
||||
} else if (units.getType() == UnitSystem::UnitType::UNIT_TYPE_LAB) {
|
||||
ss << ": : : OIL : WAT : GAS : SCC/HR : SCC/HR : SCC/HR : RCC/HR : ATMA : ATMA :\n";// :\n";
|
||||
ss << ":--------:-----------:------:------:------:-----------:-----------:-----------:-----------:--------:--------:";//--------------------:";
|
||||
}
|
||||
ss << "==============================================================================================================";//=====================";
|
||||
} else {
|
||||
if (wellInj[WellInjDataType::WellLocationi] < 1) {
|
||||
ss << std::right << std::fixed << std::setprecision(0) << ":"
|
||||
<< std::setw (8) << wellInjNames[WellInjDataType::WellName] << ":"
|
||||
<< std::setw(11) << "" << ":"
|
||||
<< std::setw(6) << wellInjNames[WellInjDataType::CTRLModeOil] << ":"
|
||||
<< std::setw(6) << wellInjNames[WellInjDataType::CTRLModeWat] << ":"
|
||||
<< std::setw(6) << wellInjNames[WellInjDataType::CTRLModeGas] << ":"
|
||||
<< std::setprecision(1) << std::setw(11) << wellInj[WellInjDataType::OilRate] << ":"
|
||||
<< std::setw(11) << wellInj[WellInjDataType::WaterRate] << ":"
|
||||
<< std::setw(11)<< wellInj[WellInjDataType::GasRate] << ":"
|
||||
<< std::setw(11) << wellInj[WellInjDataType::FluidResVol] << ":"
|
||||
<< std::setw(8)<< "" << ":" << std::setw(8)<< "" << ": \n";//wellInj[WellInjDataType::SteadyStateII] << std::setw(10) << "\n"
|
||||
} else {
|
||||
ss << std::right << std::fixed << std::setprecision(0) << ":"
|
||||
<< std::setw (8) << wellInjNames[WellInjDataType::WellName] << ":"
|
||||
<< std::setw(5) << wellInj[WellInjDataType::WellLocationi] << ","
|
||||
<< std::setw(5) << wellInj[WellInjDataType::WellLocationj] << ":"
|
||||
<< std::setw(6) << wellInjNames[WellInjDataType::CTRLModeOil] << ":"
|
||||
<< std::setw(6) << wellInjNames[WellInjDataType::CTRLModeWat] << ":"
|
||||
<< std::setw(6) << wellInjNames[WellInjDataType::CTRLModeGas] << ":"
|
||||
<< std::setprecision(1) << std::setw(11) << wellInj[WellInjDataType::OilRate] << ":"
|
||||
<< std::setw(11) << wellInj[WellInjDataType::WaterRate] << ":"
|
||||
<< std::setw(11) << wellInj[WellInjDataType::GasRate] << ":"
|
||||
<< std::setw(11) << wellInj[WellInjDataType::FluidResVol] << ":"
|
||||
<< std::setw(8) << wellInj[WellInjDataType::BHP] << ":"
|
||||
<< std::setw(8)<< wellInj[WellInjDataType::THP] << ": \n";//wellInj[WellInjDataType::SteadyStateII] << std::setw(10) << "\n"
|
||||
}
|
||||
ss << ":--------:-----------:------:------:------:-----------:-----------:-----------:-----------:--------:--------:";//--------------------:";
|
||||
}
|
||||
OpmLog::note(ss.str());
|
||||
}
|
||||
const auto isWellRecord =
|
||||
wellProd[WellProdDataType::WellLocationi] >= 1;
|
||||
|
||||
template<class Scalar>
|
||||
void LogOutputHelper<Scalar>::
|
||||
outputProductionReport_(const std::vector<Scalar>& wellProd,
|
||||
const std::vector<std::string>& wellProdNames) const
|
||||
{
|
||||
const UnitSystem& units = eclState_.getUnits();
|
||||
std::ostringstream ss;
|
||||
if (wellProdNames[WellProdDataType::WellName].empty()) {
|
||||
ss << "\n======================================================= PRODUCTION REPORT =======================================================\n"//=================== \n"
|
||||
<< ": WELL : LOCATION :CTRL: OIL : WATER : GAS : FLUID : WATER : GAS/OIL : WAT/GAS : BHP OR : THP OR :\n"// STEADY-ST PI :\n"
|
||||
<< ": NAME : (I,J,K) :MODE: RATE : RATE : RATE : RES.VOL. : CUT : RATIO : RATIO : CON.PR.: BLK.PR.:\n";// OR POTN OF PREF. PH:\n";
|
||||
if (units.getType() == UnitSystem::UnitType::UNIT_TYPE_METRIC) {
|
||||
ss << ": : : : SCM/DAY : SCM/DAY : SCM/DAY : RCM/DAY : SCM/SCM : SCM/SCM : SCM/SCM : BARSA : BARSA :\n";// :\n";
|
||||
} else if (units.getType() == UnitSystem::UnitType::UNIT_TYPE_FIELD) {
|
||||
ss << ": : : : STB/DAY : STB/DAY : MSCF/DAY : RB/DAY : : MSCF/STB : STB/MSCF : PSIA : PSIA :\n";// :\n";
|
||||
} else if (units.getType() == UnitSystem::UnitType::UNIT_TYPE_LAB) {
|
||||
ss << ": : : : SCC/HR : SCC/HR : SCC/HR : RCC : SCC/SCC : SCC/SCC : SCC/SCC : ATMA : ATMA :\n";// :\n";
|
||||
}
|
||||
ss << "=================================================================================================================================";//===================";
|
||||
|
||||
ss << std::right << std::fixed << ':'
|
||||
<< std::setw(8) << wellProdNames[WellProdDataType::WellName] << ':';
|
||||
|
||||
if (! isWellRecord) {
|
||||
ss << std::setprecision(0) << std::setw(11) << "" << ':';
|
||||
} else {
|
||||
if (wellProd[WellProdDataType::WellLocationi] < 1) {
|
||||
ss << std::right << std::fixed << ":"
|
||||
<< std::setw(8) << wellProdNames[WellProdDataType::WellName] << ":"
|
||||
<< std::setprecision(0) << std::setw(11) << "" << ":"
|
||||
<< std::setw(4) << wellProdNames[WellProdDataType::CTRLMode] << ":"
|
||||
<< std::setprecision(1) << std::setw(11) << wellProd[WellProdDataType::OilRate] << ":"
|
||||
<< std::setw(11) << wellProd[WellProdDataType::WaterRate] << ":"
|
||||
<< std::setw(11)<< wellProd[WellProdDataType::GasRate] << ":"
|
||||
<< std::setw(11) << wellProd[WellProdDataType::FluidResVol] << std::setprecision(3) << ":"
|
||||
<< std::setw(11) << wellProd[WellProdDataType::WaterCut] << std::setprecision(2) << ":"
|
||||
<< std::setw(10) << wellProd[WellProdDataType::GasOilRatio] << std::setprecision(4) << ":"
|
||||
<< std::setw(12) << wellProd[WellProdDataType::WatGasRatio] << std::setprecision(1) << ":"
|
||||
<< std::setw(8) << "" << ":" << std::setw(8) << "" << ": \n";
|
||||
} else {
|
||||
ss << std::right << std::fixed << ":"
|
||||
<< std::setw (8) << wellProdNames[WellProdDataType::WellName] << ":"
|
||||
<< std::setprecision(0) << std::setw(5) << wellProd[WellProdDataType::WellLocationi] << ","
|
||||
<< std::setw(5) << wellProd[WellProdDataType::WellLocationj] << ":"
|
||||
<< std::setw(4) << wellProdNames[WellProdDataType::CTRLMode] << ":"
|
||||
<< std::setprecision(1) << std::setw(11) << wellProd[WellProdDataType::OilRate] << ":"
|
||||
<< std::setw(11) << wellProd[WellProdDataType::WaterRate] << ":"
|
||||
<< std::setw(11)<< wellProd[WellProdDataType::GasRate] << ":"
|
||||
<< std::setw(11) << wellProd[WellProdDataType::FluidResVol] << std::setprecision(3) << ":"
|
||||
<< std::setw(11) << wellProd[WellProdDataType::WaterCut] << std::setprecision(2) << ":"
|
||||
<< std::setw(10) << wellProd[WellProdDataType::GasOilRatio] << std::setprecision(4) << ":"
|
||||
<< std::setw(12) << wellProd[WellProdDataType::WatGasRatio] << std::setprecision(1) << ":"
|
||||
<< std::setw(8) << wellProd[WellProdDataType::BHP] << ":"
|
||||
<< std::setw(8) << wellProd[WellProdDataType::THP] << ": \n";
|
||||
}
|
||||
ss << ":"<< std::setfill ('-') << std::setw (9) << ":"
|
||||
<< std::setfill ('-') << std::setw (12) << ":"
|
||||
<< std::setfill ('-') << std::setw (5) << ":"
|
||||
<< std::setfill ('-') << std::setw (12) << ":"
|
||||
<< std::setfill ('-') << std::setw (12) << ":"
|
||||
<< std::setfill ('-') << std::setw (12) << ":"
|
||||
<< std::setfill ('-') << std::setw (12) << ":"
|
||||
<< std::setfill ('-') << std::setw (12) << ":"
|
||||
<< std::setfill ('-') << std::setw (11) << ":"
|
||||
<< std::setfill ('-') << std::setw (13) << ":"
|
||||
<< std::setfill ('-') << std::setw (9) << ":"
|
||||
<< std::setfill ('-') << std::setw (9) << ':';
|
||||
ss << std::setprecision(0)
|
||||
<< std::setw(5) << wellProd[WellProdDataType::WellLocationi] << ','
|
||||
<< std::setw(5) << wellProd[WellProdDataType::WellLocationj] << ':';
|
||||
}
|
||||
|
||||
ss << std::setw( 4) << wellProdNames[WellProdDataType::CTRLMode] << ':' << std::setprecision(1)
|
||||
<< std::setw(11) << wellProd[WellProdDataType::OilRate] << ':'
|
||||
<< std::setw(11) << wellProd[WellProdDataType::WaterRate] << ':'
|
||||
<< std::setw(11) << wellProd[WellProdDataType::GasRate] << ':'
|
||||
<< std::setw(11) << wellProd[WellProdDataType::FluidResVol] << ':' << std::setprecision(3)
|
||||
<< std::setw(11) << wellProd[WellProdDataType::WaterCut] << ':' << std::setprecision(2)
|
||||
<< std::setw(10) << wellProd[WellProdDataType::GasOilRatio] << ':' << std::setprecision(4)
|
||||
<< std::setw(12) << wellProd[WellProdDataType::WatGasRatio] << ':' << std::setprecision(1);
|
||||
|
||||
if (! isWellRecord) {
|
||||
ss << std::setw(8) << "" << ':' << std::setw(8) << "" << ':';
|
||||
} else {
|
||||
ss << std::setw(8) << wellProd[WellProdDataType::BHP] << ':'
|
||||
<< std::setw(8) << wellProd[WellProdDataType::THP] << ':';
|
||||
}
|
||||
|
||||
OpmLog::note(ss.str());
|
||||
}
|
||||
|
||||
|
@ -69,8 +69,10 @@ public:
|
||||
std::function<bool(const std::string&)> isDefunct) const;
|
||||
|
||||
private:
|
||||
void outputCumulativeReport_(const std::vector<Scalar>& wellCum,
|
||||
const std::vector<std::string>& wellCumNames) const;
|
||||
void beginCumulativeReport_() const;
|
||||
void endCumulativeReport_() const;
|
||||
void outputCumulativeReportRecord_(const std::vector<Scalar>& wellCum,
|
||||
const std::vector<std::string>& wellCumNames) const;
|
||||
|
||||
void outputRegionFluidInPlace_(std::unordered_map<Inplace::Phase, Scalar> oip,
|
||||
std::unordered_map<Inplace::Phase, Scalar> cip,
|
||||
@ -81,11 +83,15 @@ private:
|
||||
void outputResvFluidInPlace_(std::unordered_map<Inplace::Phase, Scalar> cipr,
|
||||
const int reg) const;
|
||||
|
||||
void outputInjectionReport_(const std::vector<Scalar>& wellInj,
|
||||
const std::vector<std::string>& wellInjNames) const;
|
||||
void beginInjectionReport_() const;
|
||||
void endInjectionReport_() const;
|
||||
void outputInjectionReportRecord_(const std::vector<Scalar>& wellInj,
|
||||
const std::vector<std::string>& wellInjNames) const;
|
||||
|
||||
void outputProductionReport_(const std::vector<Scalar>& wellProd,
|
||||
const std::vector<std::string>& wellProdNames) const;
|
||||
void beginProductionReport_() const;
|
||||
void endProductionReport_() const;
|
||||
void outputProductionReportRecord_(const std::vector<Scalar>& wellProd,
|
||||
const std::vector<std::string>& wellProdNames) const;
|
||||
|
||||
void fipUnitConvert_(std::unordered_map<Inplace::Phase, Scalar>& fip) const;
|
||||
void pressureUnitConvert_(Scalar& pav) const;
|
||||
|
@ -99,13 +99,10 @@ BOOST_AUTO_TEST_CASE(Cumulative)
|
||||
: : : : : MSTB : MSTB : MMSCF : MRB : MSTB : MSTB : MMSCF : MRB :
|
||||
====================================================================================================================================
|
||||
: FIELD: : : : 1.0: 2.0: 3.0: 4.0: 5.0: 6.0: 7.0: 8.0:
|
||||
:--------:-----------:--------:----:-----------:-----------:-----------:-----------:------------:----------:-----------:-----------:
|
||||
: G1: : : : 9.0: 10.0: 11.0: 12.0: 13.0: 14.0: 15.0: 15.0:
|
||||
:--------:-----------:--------:----:-----------:-----------:-----------:-----------:------------:----------:-----------:-----------:
|
||||
: PROD: 10, 10: PROD:ORAT: 16.0: 17.0: 18.0: 19.0: 20.0: 21.0: 22.0: 23.0:
|
||||
:--------:-----------:--------:----:-----------:-----------:-----------:-----------:------------:----------:-----------:-----------:
|
||||
: INJ: 1, 1: INJ:GRAT: 24.0: 25.0: 26.0: 27.0: 28.0: 29.0: 30.0: 31.0:
|
||||
:--------:-----------:--------:----:-----------:-----------:-----------:-----------:------------:----------:-----------:-----------:
|
||||
:--------:-----------:--------:----:-----------:-----------:-----------:-----------:-----------:-----------:-----------:-----------:
|
||||
)";
|
||||
|
||||
std::stringstream str;
|
||||
@ -124,38 +121,42 @@ BOOST_AUTO_TEST_CASE(Cumulative)
|
||||
|
||||
Opm::EclipseState eclState(deck);
|
||||
Opm::SummaryState st;
|
||||
|
||||
// Note: Cumulative gas values--e.g., FGPT--multiplied by an additional
|
||||
// factor of 1000, for a total multiplicative factor of one million, in
|
||||
// order to produce the expected balance sheet output in MM* units.
|
||||
constexpr auto fields = std::array {
|
||||
std::pair{"FOPT", 1.0},
|
||||
std::pair{"FWPT", 2.0},
|
||||
std::pair{"FGPT", 3.0},
|
||||
std::pair{"FGPT", 3.0e3},
|
||||
std::pair{"FVPT", 4.0},
|
||||
std::pair{"FOIT", 5.0},
|
||||
std::pair{"FWIT", 6.0},
|
||||
std::pair{"FGIT", 7.0},
|
||||
std::pair{"FGIT", 7.0e3},
|
||||
std::pair{"FVIT", 8.0},
|
||||
std::pair{"GOPT:G1", 9.0},
|
||||
std::pair{"GWPT:G1", 10.0},
|
||||
std::pair{"GGPT:G1", 11.0},
|
||||
std::pair{"GGPT:G1", 11.0e3},
|
||||
std::pair{"GVPT:G1", 12.0},
|
||||
std::pair{"GOIT:G1", 13.0},
|
||||
std::pair{"GWIT:G1", 14.0},
|
||||
std::pair{"GGIT:G1", 15.0},
|
||||
std::pair{"GGIT:G1", 15.0e3},
|
||||
std::pair{"GVIT:G1", 15.0},
|
||||
std::pair{"WOPT:PROD", 16.0},
|
||||
std::pair{"WWPT:PROD", 17.0},
|
||||
std::pair{"WGPT:PROD", 18.0},
|
||||
std::pair{"WGPT:PROD", 18.0e3},
|
||||
std::pair{"WVPT:PROD", 19.0},
|
||||
std::pair{"WOIT:PROD", 20.0},
|
||||
std::pair{"WWIT:PROD", 21.0},
|
||||
std::pair{"WGIT:PROD", 22.0},
|
||||
std::pair{"WGIT:PROD", 22.0e3},
|
||||
std::pair{"WVIT:PROD", 23.0},
|
||||
std::pair{"WOPT:INJ", 24.0},
|
||||
std::pair{"WWPT:INJ", 25.0},
|
||||
std::pair{"WGPT:INJ", 26.0},
|
||||
std::pair{"WGPT:INJ", 26.0e3},
|
||||
std::pair{"WVPT:INJ", 27.0},
|
||||
std::pair{"WOIT:INJ", 28.0},
|
||||
std::pair{"WWIT:INJ", 29.0},
|
||||
std::pair{"WGIT:INJ", 30.0},
|
||||
std::pair{"WGIT:INJ", 30.0e3},
|
||||
std::pair{"WVIT:INJ", 31.0},
|
||||
};
|
||||
for (const auto& p : fields) {
|
||||
@ -333,11 +334,9 @@ BOOST_AUTO_TEST_CASE(Injection)
|
||||
: WELL : LOCATION : CTRL : CTRL : CTRL : OIL : WATER : GAS : FLUID : BHP OR : THP OR :
|
||||
: NAME : (I,J,K) : MODE : MODE : MODE : RATE : RATE : RATE : RES.VOL. : CON.PR.: BLK.PR.:
|
||||
: : : OIL : WAT : GAS : STB/DAY : STB/DAY : MSCF/DAY : RB/DAY : PSIA : PSIA :
|
||||
==============================================================================================================
|
||||
=============================================================================================================
|
||||
: FIELD: : : : : 1.0: 2.0: 3.0: 4.0: : :
|
||||
:--------:-----------:------:------:------:-----------:-----------:-----------:-----------:--------:--------:
|
||||
: G1: : : : : 5.0: 6.0: 7.0: 8.0: : :
|
||||
:--------:-----------:------:------:------:-----------:-----------:-----------:-----------:--------:--------:
|
||||
: INJ: 1, 1: : : GRAT: 9.0: 10.0: 11.0: 12.0: 13.0: 14.0:
|
||||
:--------:-----------:------:------:------:-----------:-----------:-----------:-----------:--------:--------:
|
||||
)";
|
||||
@ -391,9 +390,7 @@ BOOST_AUTO_TEST_CASE(Production)
|
||||
: : : : STB/DAY : STB/DAY : MSCF/DAY : RB/DAY : : MSCF/STB : STB/MSCF : PSIA : PSIA :
|
||||
=================================================================================================================================
|
||||
: FIELD: : : 1.0: 2.0: 3.0: 4.0: 5.000: 6.00: 0.6667: : :
|
||||
:--------:-----------:----:-----------:-----------:-----------:-----------:-----------:----------:------------:--------:--------:
|
||||
: G1: : : 7.0: 8.0: 9.0: 10.0: 11.000: 12.00: 0.8889: : :
|
||||
:--------:-----------:----:-----------:-----------:-----------:-----------:-----------:----------:------------:--------:--------:
|
||||
: PROD: 10, 10:ORAT: 13.0: 14.0: 15.0: 16.0: 17.000: 18.00: 0.9333: 19.0: 20.0:
|
||||
:--------:-----------:----:-----------:-----------:-----------:-----------:-----------:----------:------------:--------:--------:
|
||||
)";
|
||||
|
Loading…
Reference in New Issue
Block a user