mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
move output of production log to LogOutputHelper
This commit is contained in:
@@ -236,117 +236,10 @@ outputProdLog(size_t reportStepNum,
|
|||||||
const bool substep,
|
const bool substep,
|
||||||
bool forceDisableProdOutput)
|
bool forceDisableProdOutput)
|
||||||
{
|
{
|
||||||
if (!substep) {
|
if (!substep && !forceDisableProdOutput) {
|
||||||
ScalarBuffer tmp_values(WellProdDataType::numWPValues, 0.0);
|
logOutput_.production(reportStepNum,
|
||||||
StringBuffer tmp_names(WellProdDataType::numWPNames, "");
|
[this](const std::string& name)
|
||||||
outputProductionReport_(tmp_values, tmp_names, forceDisableProdOutput);
|
{ return this->isDefunctParallelWell(name); });
|
||||||
|
|
||||||
const auto& st = summaryState_;
|
|
||||||
|
|
||||||
for (const auto& gname: schedule_.groupNames()) {
|
|
||||||
|
|
||||||
auto gName = static_cast<std::string>(gname);
|
|
||||||
auto get = [&st, &gName](const std::string& vector)
|
|
||||||
{
|
|
||||||
const auto key = vector + ':' + gName;
|
|
||||||
|
|
||||||
return st.has(key) ? st.get(key) : 0.0;
|
|
||||||
};
|
|
||||||
|
|
||||||
tmp_names[0] = gname;
|
|
||||||
|
|
||||||
if (tmp_names[0] == "FIELD"){
|
|
||||||
tmp_values[2] = st.get("FOPR", 0.0); //WellProdDataType::OilRate
|
|
||||||
tmp_values[3] = st.get("FWPR", 0.0); //WellProdDataType::WaterRate
|
|
||||||
tmp_values[4] = st.get("FGPR", 0.0); //WellProdDataType::GasRate
|
|
||||||
tmp_values[5] = st.get("FVPR", 0.0); //WellProdDataType::FluidResVol
|
|
||||||
tmp_values[6] = st.get("FWCT", 0.0); //WellProdDataType::WaterCut
|
|
||||||
tmp_values[7] = st.get("FGOR", 0.0); //WellProdDataType::GasOilRatio
|
|
||||||
} else {
|
|
||||||
tmp_values[2] = get("GOPR"); //WellProdDataType::OilRate
|
|
||||||
tmp_values[3] = get("GWPR"); //WellProdDataType::WaterRate
|
|
||||||
tmp_values[4] = get("GGPR"); //WellProdDataType::GasRate
|
|
||||||
tmp_values[5] = get("GVPR"); //WellProdDataType::FluidResVol
|
|
||||||
tmp_values[6] = get("GWCT"); //WellProdDataType::WaterCut
|
|
||||||
tmp_values[7] = get("GGOR"); //WellProdDataType::GasOilRatio
|
|
||||||
}
|
|
||||||
|
|
||||||
tmp_values[8] = tmp_values[3]/tmp_values[4]; //WellProdDataType::WaterGasRatio
|
|
||||||
if (isnan(tmp_values[8])){
|
|
||||||
tmp_values[8] = 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
outputProductionReport_(tmp_values, tmp_names, forceDisableProdOutput);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const auto& wname: schedule_.wellNames(reportStepNum)) {
|
|
||||||
|
|
||||||
// don't bother with wells not on this process
|
|
||||||
if (isDefunctParallelWell(wname)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto& well = schedule_.getWell(wname, reportStepNum);
|
|
||||||
|
|
||||||
// Ignore injector wells
|
|
||||||
if (well.isInjector()){
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
tmp_names[0] = wname;//WellProdDataType::WellName
|
|
||||||
|
|
||||||
|
|
||||||
auto wName = static_cast<std::string>(wname);
|
|
||||||
auto get = [&st, &wName](const std::string& vector)
|
|
||||||
{
|
|
||||||
const auto key = vector + ':' + wName;
|
|
||||||
|
|
||||||
return st.has(key) ? st.get(key) : 0.0;
|
|
||||||
};
|
|
||||||
|
|
||||||
const auto& controls = well.productionControls(st);
|
|
||||||
using CMode = Well::ProducerCMode;
|
|
||||||
|
|
||||||
auto fctl = [](const auto wmctl) -> std::string
|
|
||||||
{
|
|
||||||
switch (wmctl) {
|
|
||||||
case CMode::ORAT: return "ORAT";
|
|
||||||
case CMode::WRAT: return "WRAT";
|
|
||||||
case CMode::GRAT: return "GRAT";
|
|
||||||
case CMode::LRAT: return "LRAT";
|
|
||||||
case CMode::RESV: return "RESV";
|
|
||||||
case CMode::THP: return "THP";
|
|
||||||
case CMode::BHP: return "BHP";
|
|
||||||
case CMode::CRAT: return "CRate";
|
|
||||||
case CMode::GRUP: return "GRUP";
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
return "none";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
tmp_names[1] = fctl(controls.cmode); //WellProdDataType::CTRLMode
|
|
||||||
|
|
||||||
tmp_values[0] = well.getHeadI() + 1;//WellProdDataType::WellLocationi
|
|
||||||
tmp_values[1] = well.getHeadJ() + 1;//WellProdDataType::WellLocationj
|
|
||||||
tmp_values[2] = get("WOPR"); //WellProdDataType::OilRate
|
|
||||||
tmp_values[3] = get("WWPR"); //WellProdDataType::WaterRate
|
|
||||||
tmp_values[4] = get("WGPR"); //WellProdDataType::GasRate
|
|
||||||
tmp_values[5] = get("WVPR"); //WellProdDataType::FluidResVol
|
|
||||||
tmp_values[6] = get("WWCT"); //WellProdDataType::WaterCut
|
|
||||||
tmp_values[7] = get("WGOR"); //WellProdDataType::GasOilRatio
|
|
||||||
tmp_values[9] = get("WBHP"); //WellProdDataType::BHP
|
|
||||||
tmp_values[10] = get("WTHP"); //WellProdDataType::THP
|
|
||||||
//tmp_values[11] = 0; //WellProdDataType::SteadyStatePI //
|
|
||||||
|
|
||||||
tmp_values[8] = tmp_values[3]/tmp_values[4]; //WellProdDataType::WaterGasRatio
|
|
||||||
if (isnan(tmp_values[8])){
|
|
||||||
tmp_values[8] = 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
outputProductionReport_(tmp_values, tmp_names, forceDisableProdOutput);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1412,44 +1305,6 @@ outputResvFluidInPlace_(std::unordered_map<Inplace::Phase, Scalar> cipr, const i
|
|||||||
OpmLog::note(ss.str());
|
OpmLog::note(ss.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class FluidSystem, class Scalar>
|
|
||||||
void EclGenericOutputBlackoilModule<FluidSystem,Scalar>::
|
|
||||||
outputProductionReport_(const ScalarBuffer& wellProd,
|
|
||||||
const StringBuffer& wellProdNames,
|
|
||||||
const bool forceDisableProdOutput)
|
|
||||||
{
|
|
||||||
if (forceDisableProdOutput)
|
|
||||||
return;
|
|
||||||
|
|
||||||
const UnitSystem& units = eclState_.getUnits();
|
|
||||||
std::ostringstream ss;
|
|
||||||
if (wellProdNames[WellProdDataType::WellName].empty()) {
|
|
||||||
ss << "======================================================= 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";
|
|
||||||
}
|
|
||||||
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";
|
|
||||||
}
|
|
||||||
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 << "=================================================================================================================================\n";//=================== \n";
|
|
||||||
}
|
|
||||||
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) << ":" << "\n";
|
|
||||||
}
|
|
||||||
OpmLog::note(ss.str());
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class FluidSystem, class Scalar>
|
template<class FluidSystem, class Scalar>
|
||||||
void EclGenericOutputBlackoilModule<FluidSystem,Scalar>::
|
void EclGenericOutputBlackoilModule<FluidSystem,Scalar>::
|
||||||
outputInjectionReport_(const ScalarBuffer& wellInj,
|
outputInjectionReport_(const ScalarBuffer& wellInj,
|
||||||
|
|||||||
@@ -294,30 +294,6 @@ protected:
|
|||||||
bool enableExtbo,
|
bool enableExtbo,
|
||||||
bool enableMICP);
|
bool enableMICP);
|
||||||
|
|
||||||
struct WellProdDataType
|
|
||||||
{
|
|
||||||
enum WPId
|
|
||||||
{
|
|
||||||
WellLocationi = 0, //WLi
|
|
||||||
WellLocationj = 1, //WLj
|
|
||||||
OilRate = 2, //OR
|
|
||||||
WaterRate = 3, //WR
|
|
||||||
GasRate = 4, //GR
|
|
||||||
FluidResVol = 5, //FRV
|
|
||||||
WaterCut = 6, //WC
|
|
||||||
GasOilRatio = 7, //GOR
|
|
||||||
WatGasRatio = 8, //WGR
|
|
||||||
BHP = 9, //BHP
|
|
||||||
THP = 10, //THP
|
|
||||||
SteadyStatePI = 11, //SteadyStatePI
|
|
||||||
WellName = 0, //WName
|
|
||||||
CTRLMode = 1, //CTRL
|
|
||||||
};
|
|
||||||
|
|
||||||
static constexpr int numWPValues = 12;
|
|
||||||
static constexpr int numWPNames = 2;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct WellInjDataType
|
struct WellInjDataType
|
||||||
{
|
{
|
||||||
enum WIId
|
enum WIId
|
||||||
@@ -359,9 +335,6 @@ protected:
|
|||||||
const Scalar& pav, const int reg = 0) const;
|
const Scalar& pav, const int reg = 0) const;
|
||||||
void outputResvFluidInPlace_(std::unordered_map<Inplace::Phase, Scalar> cipr,
|
void outputResvFluidInPlace_(std::unordered_map<Inplace::Phase, Scalar> cipr,
|
||||||
const int reg = 0) const;
|
const int reg = 0) const;
|
||||||
void outputProductionReport_(const ScalarBuffer& wellProd,
|
|
||||||
const StringBuffer& wellProdNames,
|
|
||||||
const bool forceDisableProdOutput);
|
|
||||||
void outputInjectionReport_(const ScalarBuffer& wellInj,
|
void outputInjectionReport_(const ScalarBuffer& wellInj,
|
||||||
const StringBuffer& wellInjNames,
|
const StringBuffer& wellInjNames,
|
||||||
const bool forceDisableInjOutput);
|
const bool forceDisableInjOutput);
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
#include <opm/input/eclipse/Schedule/SummaryState.hpp>
|
#include <opm/input/eclipse/Schedule/SummaryState.hpp>
|
||||||
#include <opm/input/eclipse/Schedule/Well/Well.hpp>
|
#include <opm/input/eclipse/Schedule/Well/Well.hpp>
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@@ -160,28 +161,134 @@ cumulative(const std::size_t reportStepNum,
|
|||||||
case CMode::BHP: return "BHP";
|
case CMode::BHP: return "BHP";
|
||||||
case CMode::CRAT: return "CRAT";
|
case CMode::CRAT: return "CRAT";
|
||||||
case CMode::GRUP: return "GRUP";
|
case CMode::GRUP: return "GRUP";
|
||||||
default:
|
default: return "none";
|
||||||
{
|
|
||||||
return "none";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
tmp_names[1] = "PROD"; //WellProdDataType::CTRLMode
|
tmp_names[1] = "PROD"; // WellProdDataType::CTRLMode
|
||||||
tmp_names[2] = fctl(controls.cmode); //WellProdDataType::CTRLMode
|
tmp_names[2] = fctl(controls.cmode); // WellProdDataType::CTRLMode
|
||||||
}
|
}
|
||||||
|
|
||||||
tmp_values[0] = well.getHeadI() + 1; //WellCumDataType::wellLocationi
|
tmp_values[0] = well.getHeadI() + 1; // WellCumDataType::wellLocationi
|
||||||
tmp_values[1] = well.getHeadJ() + 1; //WellCumDataType::wellLocationj
|
tmp_values[1] = well.getHeadJ() + 1; // WellCumDataType::wellLocationj
|
||||||
tmp_values[2] = get("WOPT"); //WellCumDataType::OilProd
|
tmp_values[2] = get("WOPT"); // WellCumDataType::OilProd
|
||||||
tmp_values[3] = get("WWPT"); //WellCumDataType::WaterProd
|
tmp_values[3] = get("WWPT"); // WellCumDataType::WaterProd
|
||||||
tmp_values[4] = get("WGPT"); //WellCumDataType::GasProd
|
tmp_values[4] = get("WGPT"); // WellCumDataType::GasProd
|
||||||
tmp_values[5] = get("WVPT");//WellCumDataType::FluidResVolProd
|
tmp_values[5] = get("WVPT"); // WellCumDataType::FluidResVolProd
|
||||||
tmp_values[6] = get("WOIT"); //WellCumDataType::OilInj
|
tmp_values[6] = get("WOIT"); // WellCumDataType::OilInj
|
||||||
tmp_values[7] = get("WWIT"); //WellCumDataType::WaterInj
|
tmp_values[7] = get("WWIT"); // WellCumDataType::WaterInj
|
||||||
tmp_values[8] = get("WGIT"); //WellCumDataType::GasInj
|
tmp_values[8] = get("WGIT"); // WellCumDataType::GasInj
|
||||||
tmp_values[9] = get("WVIT");//WellCumDataType::FluidResVolInj
|
tmp_values[9] = get("WVIT"); // WellCumDataType::FluidResVolInj
|
||||||
|
|
||||||
outputCumulativeReport_(tmp_values, tmp_names);
|
this->outputCumulativeReport_(tmp_values, tmp_names);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class Scalar>
|
||||||
|
void LogOutputHelper<Scalar>::
|
||||||
|
production(const std::size_t reportStepNum,
|
||||||
|
std::function<bool(const std::string&)> isDefunct) const
|
||||||
|
{
|
||||||
|
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()) {
|
||||||
|
auto gName = static_cast<std::string>(gname);
|
||||||
|
auto get = [&st, &gName](const std::string& vector)
|
||||||
|
{
|
||||||
|
const auto key = vector + ':' + gName;
|
||||||
|
return st.has(key) ? st.get(key) : 0.0;
|
||||||
|
};
|
||||||
|
|
||||||
|
tmp_names[0] = gname;
|
||||||
|
if (tmp_names[0] == "FIELD") {
|
||||||
|
tmp_values[2] = st.get("FOPR", 0.0); // WellProdDataType::OilRate
|
||||||
|
tmp_values[3] = st.get("FWPR", 0.0); // WellProdDataType::WaterRate
|
||||||
|
tmp_values[4] = st.get("FGPR", 0.0); // WellProdDataType::GasRate
|
||||||
|
tmp_values[5] = st.get("FVPR", 0.0); // WellProdDataType::FluidResVol
|
||||||
|
tmp_values[6] = st.get("FWCT", 0.0); // WellProdDataType::WaterCut
|
||||||
|
tmp_values[7] = st.get("FGOR", 0.0); // WellProdDataType::GasOilRatio
|
||||||
|
} else {
|
||||||
|
tmp_values[2] = get("GOPR"); // WellProdDataType::OilRate
|
||||||
|
tmp_values[3] = get("GWPR"); // WellProdDataType::WaterRate
|
||||||
|
tmp_values[4] = get("GGPR"); // WellProdDataType::GasRate
|
||||||
|
tmp_values[5] = get("GVPR"); // WellProdDataType::FluidResVol
|
||||||
|
tmp_values[6] = get("GWCT"); // WellProdDataType::WaterCut
|
||||||
|
tmp_values[7] = get("GGOR"); // WellProdDataType::GasOilRatio
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp_values[8] = tmp_values[3] / tmp_values[4]; // WellProdDataType::WaterGasRatio
|
||||||
|
if (std::isnan(tmp_values[8])) {
|
||||||
|
tmp_values[8] = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->outputProductionReport_(tmp_values, tmp_names);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto& wname : schedule_.wellNames(reportStepNum)) {
|
||||||
|
|
||||||
|
// don't bother with wells not on this process
|
||||||
|
if (isDefunct(wname)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto& well = schedule_.getWell(wname, reportStepNum);
|
||||||
|
|
||||||
|
// Ignore injector wells
|
||||||
|
if (well.isInjector()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp_names[0] = wname; // WellProdDataType::WellName
|
||||||
|
|
||||||
|
|
||||||
|
auto wName = static_cast<std::string>(wname);
|
||||||
|
auto get = [&st, &wName](const std::string& vector)
|
||||||
|
{
|
||||||
|
const auto key = vector + ':' + wName;
|
||||||
|
return st.has(key) ? st.get(key) : 0.0;
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto& controls = well.productionControls(st);
|
||||||
|
using CMode = Well::ProducerCMode;
|
||||||
|
|
||||||
|
auto fctl = [](const auto wmctl) -> std::string
|
||||||
|
{
|
||||||
|
switch (wmctl) {
|
||||||
|
case CMode::ORAT: return "ORAT";
|
||||||
|
case CMode::WRAT: return "WRAT";
|
||||||
|
case CMode::GRAT: return "GRAT";
|
||||||
|
case CMode::LRAT: return "LRAT";
|
||||||
|
case CMode::RESV: return "RESV";
|
||||||
|
case CMode::THP: return "THP";
|
||||||
|
case CMode::BHP: return "BHP";
|
||||||
|
case CMode::CRAT: return "CRate";
|
||||||
|
case CMode::GRUP: return "GRUP";
|
||||||
|
default: return "none";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
tmp_names[1] = fctl(controls.cmode); // WellProdDataType::CTRLMode
|
||||||
|
|
||||||
|
tmp_values[0] = well.getHeadI() + 1; // WellProdDataType::WellLocationi
|
||||||
|
tmp_values[1] = well.getHeadJ() + 1; // WellProdDataType::WellLocationj
|
||||||
|
tmp_values[2] = get("WOPR"); // WellProdDataType::OilRate
|
||||||
|
tmp_values[3] = get("WWPR"); // WellProdDataType::WaterRate
|
||||||
|
tmp_values[4] = get("WGPR"); // WellProdDataType::GasRate
|
||||||
|
tmp_values[5] = get("WVPR"); // WellProdDataType::FluidResVol
|
||||||
|
tmp_values[6] = get("WWCT"); // WellProdDataType::WaterCut
|
||||||
|
tmp_values[7] = get("WGOR"); // WellProdDataType::GasOilRatio
|
||||||
|
tmp_values[9] = get("WBHP"); // WellProdDataType::BHP
|
||||||
|
tmp_values[10] = get("WTHP"); // WellProdDataType::THP
|
||||||
|
//tmp_values[11] = 0; //WellProdDataType::SteadyStatePI //
|
||||||
|
|
||||||
|
tmp_values[8] = tmp_values[3] / tmp_values[4]; // WellProdDataType::WaterGasRatio
|
||||||
|
if (std::isnan(tmp_values[8])) {
|
||||||
|
tmp_values[8] = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
this->outputProductionReport_(tmp_values, tmp_names);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -240,6 +347,71 @@ outputCumulativeReport_(const std::vector<Scalar>& wellCum,
|
|||||||
OpmLog::note(ss.str());
|
OpmLog::note(ss.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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 << "======================================================= 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 << "=================================================================================================================================\n";//=================== \n";
|
||||||
|
} 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) << ":" << "\n";
|
||||||
|
}
|
||||||
|
OpmLog::note(ss.str());
|
||||||
|
}
|
||||||
|
|
||||||
template class LogOutputHelper<double>;
|
template class LogOutputHelper<double>;
|
||||||
|
|
||||||
} // namespace Opm
|
} // namespace Opm
|
||||||
|
|||||||
@@ -43,10 +43,17 @@ public:
|
|||||||
void cumulative(const std::size_t reportStepNum,
|
void cumulative(const std::size_t reportStepNum,
|
||||||
std::function<bool(const std::string&)> isDefunct) const;
|
std::function<bool(const std::string&)> isDefunct) const;
|
||||||
|
|
||||||
|
//! \brief Write production report to output.
|
||||||
|
void production(const std::size_t reportStepNum,
|
||||||
|
std::function<bool(const std::string&)> isDefunct) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void outputCumulativeReport_(const std::vector<Scalar>& wellCum,
|
void outputCumulativeReport_(const std::vector<Scalar>& wellCum,
|
||||||
const std::vector<std::string>& wellCumNames) const;
|
const std::vector<std::string>& wellCumNames) const;
|
||||||
|
|
||||||
|
void outputProductionReport_(const std::vector<Scalar>& wellProd,
|
||||||
|
const std::vector<std::string>& wellProdNames) const;
|
||||||
|
|
||||||
struct WellCumDataType
|
struct WellCumDataType
|
||||||
{
|
{
|
||||||
enum WCId
|
enum WCId
|
||||||
@@ -69,6 +76,30 @@ private:
|
|||||||
static constexpr int numWCNames = 3;
|
static constexpr int numWCNames = 3;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct WellProdDataType
|
||||||
|
{
|
||||||
|
enum WPId
|
||||||
|
{
|
||||||
|
WellLocationi = 0, // WLi
|
||||||
|
WellLocationj = 1, // WLj
|
||||||
|
OilRate = 2, // OR
|
||||||
|
WaterRate = 3, // WR
|
||||||
|
GasRate = 4, // GR
|
||||||
|
FluidResVol = 5, // FRV
|
||||||
|
WaterCut = 6, // WC
|
||||||
|
GasOilRatio = 7, // GOR
|
||||||
|
WatGasRatio = 8, // WGR
|
||||||
|
BHP = 9, // BHP
|
||||||
|
THP = 10, // THP
|
||||||
|
SteadyStatePI = 11, // SteadyStatePI
|
||||||
|
WellName = 0, // WName
|
||||||
|
CTRLMode = 1, // CTRL
|
||||||
|
};
|
||||||
|
|
||||||
|
static constexpr int numWPValues = 12;
|
||||||
|
static constexpr int numWPNames = 2;
|
||||||
|
};
|
||||||
|
|
||||||
const EclipseState& eclState_;
|
const EclipseState& eclState_;
|
||||||
const Schedule& schedule_;
|
const Schedule& schedule_;
|
||||||
const SummaryState& summaryState_;
|
const SummaryState& summaryState_;
|
||||||
|
|||||||
Reference in New Issue
Block a user