mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
first version of micp implementation in flow
This commit is contained in:
@@ -126,6 +126,10 @@ template<class TypeTag>
|
||||
struct EnableBrine<TypeTag, TTag::EclFlowProblem> {
|
||||
static constexpr bool value = false;
|
||||
};
|
||||
template<class TypeTag>
|
||||
struct EnableMICP<TypeTag, TTag::EclFlowProblem> {
|
||||
static constexpr bool value = false;
|
||||
};
|
||||
|
||||
template<class TypeTag>
|
||||
struct EclWellModel<TypeTag, TTag::EclFlowProblem> {
|
||||
@@ -172,6 +176,11 @@ namespace Opm {
|
||||
static const int contiPolymerMWEqIdx = Indices::contiPolymerMWEqIdx;
|
||||
static const int contiFoamEqIdx = Indices::contiFoamEqIdx;
|
||||
static const int contiBrineEqIdx = Indices::contiBrineEqIdx;
|
||||
static const int contiMicrobialEqIdx = Indices::contiMicrobialEqIdx;
|
||||
static const int contiOxygenEqIdx = Indices::contiOxygenEqIdx;
|
||||
static const int contiUreaEqIdx = Indices::contiUreaEqIdx;
|
||||
static const int contiBiofilmEqIdx = Indices::contiBiofilmEqIdx;
|
||||
static const int contiCalciteEqIdx = Indices::contiCalciteEqIdx;
|
||||
static const int solventSaturationIdx = Indices::solventSaturationIdx;
|
||||
static const int zFractionIdx = Indices::zFractionIdx;
|
||||
static const int polymerConcentrationIdx = Indices::polymerConcentrationIdx;
|
||||
@@ -179,6 +188,11 @@ namespace Opm {
|
||||
static const int temperatureIdx = Indices::temperatureIdx;
|
||||
static const int foamConcentrationIdx = Indices::foamConcentrationIdx;
|
||||
static const int saltConcentrationIdx = Indices::saltConcentrationIdx;
|
||||
static const int microbialConcentrationIdx = Indices::microbialConcentrationIdx;
|
||||
static const int oxygenConcentrationIdx = Indices::oxygenConcentrationIdx;
|
||||
static const int ureaConcentrationIdx = Indices::ureaConcentrationIdx;
|
||||
static const int biofilmConcentrationIdx = Indices::biofilmConcentrationIdx;
|
||||
static const int calciteConcentrationIdx = Indices::calciteConcentrationIdx;
|
||||
|
||||
typedef Dune::FieldVector<Scalar, numEq > VectorBlockType;
|
||||
typedef typename SparseMatrixAdapter::MatrixBlock MatrixBlockType;
|
||||
@@ -451,13 +465,13 @@ namespace Opm {
|
||||
|
||||
Scalar saturationsNew[FluidSystem::numPhases] = { 0.0 };
|
||||
Scalar oilSaturationNew = 1.0;
|
||||
if (FluidSystem::phaseIsActive(FluidSystem::waterPhaseIdx)) {
|
||||
if (FluidSystem::phaseIsActive(FluidSystem::waterPhaseIdx) && FluidSystem::numActivePhases() > 1) {
|
||||
saturationsNew[FluidSystem::waterPhaseIdx] = priVarsNew[Indices::waterSaturationIdx];
|
||||
oilSaturationNew -= saturationsNew[FluidSystem::waterPhaseIdx];
|
||||
}
|
||||
|
||||
if (FluidSystem::phaseIsActive(FluidSystem::gasPhaseIdx) &&
|
||||
FluidSystem::phaseIsActive(FluidSystem::oilPhaseIdx) &&
|
||||
if (FluidSystem::phaseIsActive(FluidSystem::gasPhaseIdx) &&
|
||||
FluidSystem::phaseIsActive(FluidSystem::oilPhaseIdx) &&
|
||||
priVarsNew.primaryVarsMeaning() == PrimaryVariables::Sw_po_Sg) {
|
||||
assert(Indices::compositionSwitchIdx >= 0 );
|
||||
saturationsNew[FluidSystem::gasPhaseIdx] = priVarsNew[Indices::compositionSwitchIdx];
|
||||
@@ -488,7 +502,7 @@ namespace Opm {
|
||||
}
|
||||
|
||||
if (FluidSystem::phaseIsActive(FluidSystem::gasPhaseIdx) &&
|
||||
FluidSystem::phaseIsActive(FluidSystem::oilPhaseIdx) &&
|
||||
FluidSystem::phaseIsActive(FluidSystem::oilPhaseIdx) &&
|
||||
priVarsOld.primaryVarsMeaning() == PrimaryVariables::Sw_po_Sg)
|
||||
{
|
||||
assert(Indices::compositionSwitchIdx >= 0 );
|
||||
@@ -725,7 +739,29 @@ namespace Opm {
|
||||
maxCoeff[ contiEnergyEqIdx ] = std::max( maxCoeff[ contiEnergyEqIdx ], std::abs( R2 ) / pvValue );
|
||||
}
|
||||
|
||||
if constexpr (has_micp_) {
|
||||
B_avg[ contiMicrobialEqIdx ] += 1.0 / fs.invB(FluidSystem::waterPhaseIdx).value();
|
||||
const auto R1 = ebosResid[cell_idx][contiMicrobialEqIdx];
|
||||
R_sum[ contiMicrobialEqIdx ] += R1;
|
||||
maxCoeff[ contiMicrobialEqIdx ] = std::max( maxCoeff[ contiMicrobialEqIdx ], std::abs( R1 ) / pvValue );
|
||||
B_avg[ contiOxygenEqIdx ] += 1.0 / fs.invB(FluidSystem::waterPhaseIdx).value();
|
||||
const auto R2 = ebosResid[cell_idx][contiOxygenEqIdx];
|
||||
R_sum[ contiOxygenEqIdx ] += R2;
|
||||
maxCoeff[ contiOxygenEqIdx ] = std::max( maxCoeff[ contiOxygenEqIdx ], std::abs( R2 ) / pvValue );
|
||||
B_avg[ contiUreaEqIdx ] += 1.0 / fs.invB(FluidSystem::waterPhaseIdx).value();
|
||||
const auto R3 = ebosResid[cell_idx][contiUreaEqIdx];
|
||||
R_sum[ contiUreaEqIdx ] += R3;
|
||||
maxCoeff[ contiUreaEqIdx ] = std::max( maxCoeff[ contiUreaEqIdx ], std::abs( R3 ) / pvValue );
|
||||
B_avg[ contiBiofilmEqIdx ] += 1.0 / fs.invB(FluidSystem::waterPhaseIdx).value();
|
||||
const auto R4 = ebosResid[cell_idx][contiBiofilmEqIdx];
|
||||
R_sum[ contiBiofilmEqIdx ] += R4;
|
||||
maxCoeff[ contiBiofilmEqIdx ] = std::max( maxCoeff[ contiBiofilmEqIdx ], std::abs( R4 ) / pvValue );
|
||||
B_avg[ contiCalciteEqIdx ] += 1.0 / fs.invB(FluidSystem::waterPhaseIdx).value();
|
||||
const auto R5 = ebosResid[cell_idx][contiCalciteEqIdx];
|
||||
R_sum[ contiCalciteEqIdx ] += R5;
|
||||
maxCoeff[ contiCalciteEqIdx ] = std::max( maxCoeff[ contiCalciteEqIdx ], std::abs( R5 ) / pvValue );
|
||||
}
|
||||
}
|
||||
|
||||
OPM_END_PARALLEL_TRY_CATCH("BlackoilModelEbos::localConvergenceData() failed: ");
|
||||
|
||||
@@ -801,7 +837,7 @@ namespace Opm {
|
||||
// max_strict_iter_ is 8. Hence only iteration chooses
|
||||
// whether to use relaxed or not.
|
||||
// To activate only fraction use fraction below 1 and iter 0.
|
||||
const bool use_relaxed = cnvErrorPvFraction < param_.relaxed_max_pv_fraction_ && iteration >= param_.max_strict_iter_;
|
||||
const bool use_relaxed = cnvErrorPvFraction < param_.relaxed_max_pv_fraction_ && iteration >= param_.max_strict_iter_;
|
||||
const double tol_cnv = use_relaxed ? param_.tolerance_cnv_relaxed_ : param_.tolerance_cnv_;
|
||||
|
||||
// Finish computation
|
||||
@@ -848,6 +884,13 @@ namespace Opm {
|
||||
if constexpr (has_brine_) {
|
||||
compNames[saltConcentrationIdx] = "Brine";
|
||||
}
|
||||
if constexpr (has_micp_) {
|
||||
compNames[microbialConcentrationIdx] = "Microbes";
|
||||
compNames[oxygenConcentrationIdx] = "Oxygen";
|
||||
compNames[ureaConcentrationIdx] = "Urea";
|
||||
compNames[biofilmConcentrationIdx] = "Biofilm";
|
||||
compNames[calciteConcentrationIdx] = "Calcite";
|
||||
}
|
||||
}
|
||||
|
||||
// Create convergence report.
|
||||
@@ -993,6 +1036,7 @@ namespace Opm {
|
||||
static constexpr bool has_energy_ = getPropValue<TypeTag, Properties::EnableEnergy>();
|
||||
static constexpr bool has_foam_ = getPropValue<TypeTag, Properties::EnableFoam>();
|
||||
static constexpr bool has_brine_ = getPropValue<TypeTag, Properties::EnableBrine>();
|
||||
static constexpr bool has_micp_ = getPropValue<TypeTag, Properties::EnableMICP>();
|
||||
|
||||
ModelParameters param_;
|
||||
SimulatorReportSingle failureReport_;
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
# include <flow/flow_ebos_energy.hpp>
|
||||
# include <flow/flow_ebos_oilwater_polymer.hpp>
|
||||
# include <flow/flow_ebos_oilwater_polymer_injectivity.hpp>
|
||||
# include <flow/flow_ebos_micp.hpp>
|
||||
# endif
|
||||
|
||||
#include <opm/parser/eclipse/Deck/Deck.hpp>
|
||||
@@ -235,6 +236,19 @@ namespace Opm
|
||||
|
||||
if ( false ) {}
|
||||
#ifndef FLOW_BLACKOIL_ONLY
|
||||
// Single-phase case
|
||||
else if( eclipseState_->runspec().micp() ) {
|
||||
// micp
|
||||
if ( !phases.active( Phase::WATER) || phases.size() > 2) {
|
||||
if (outputCout_)
|
||||
std::cerr << "No valid configuration is found for MICP simulation, the only valid option is "
|
||||
<< "water + MICP" << std::endl;
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
flowEbosMICPSetDeck(
|
||||
setupTime_, deck_, eclipseState_, schedule_, summaryConfig_);
|
||||
return flowEbosMICPMain(argc_, argv_, outputCout_, outputFiles_);
|
||||
}
|
||||
// Twophase cases
|
||||
else if( phases.size() == 2 ) {
|
||||
// oil-gas
|
||||
|
||||
@@ -83,6 +83,7 @@ public:
|
||||
|
||||
typedef AdaptiveTimeSteppingEbos<TypeTag> TimeStepper;
|
||||
typedef BlackOilPolymerModule<TypeTag> PolymerModule;
|
||||
typedef BlackOilMICPModule<TypeTag> MICPModule;
|
||||
|
||||
typedef BlackoilModelEbos<TypeTag> Model;
|
||||
typedef NonlinearSolverEbos<TypeTag, Model> Solver;
|
||||
|
||||
24
opm/simulators/linalg/FlexibleSolver5.cpp
Normal file
24
opm/simulators/linalg/FlexibleSolver5.cpp
Normal file
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
Copyright 2019, 2020 SINTEF Digital, Mathematics and Cybernetics.
|
||||
|
||||
This file is part of the Open Porous Media project (OPM).
|
||||
|
||||
OPM is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
OPM is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OPM. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <opm/simulators/linalg/FlexibleSolver_impl.hpp>
|
||||
|
||||
INSTANTIATE_FLEXIBLESOLVER(5);
|
||||
24
opm/simulators/linalg/FlexibleSolver6.cpp
Normal file
24
opm/simulators/linalg/FlexibleSolver6.cpp
Normal file
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
Copyright 2019, 2020 SINTEF Digital, Mathematics and Cybernetics.
|
||||
|
||||
This file is part of the Open Porous Media project (OPM).
|
||||
|
||||
OPM is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
OPM is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OPM. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <opm/simulators/linalg/FlexibleSolver_impl.hpp>
|
||||
|
||||
INSTANTIATE_FLEXIBLESOLVER(6);
|
||||
@@ -679,9 +679,9 @@ INSTANTIATE_BDA_FUNCTIONS(1);
|
||||
INSTANTIATE_BDA_FUNCTIONS(2);
|
||||
INSTANTIATE_BDA_FUNCTIONS(3);
|
||||
INSTANTIATE_BDA_FUNCTIONS(4);
|
||||
INSTANTIATE_BDA_FUNCTIONS(5);
|
||||
INSTANTIATE_BDA_FUNCTIONS(6);
|
||||
|
||||
#undef INSTANTIATE_BDA_FUNCTIONS
|
||||
|
||||
} // end namespace bda
|
||||
|
||||
|
||||
|
||||
@@ -292,9 +292,9 @@ INSTANTIATE_BDA_FUNCTIONS(1);
|
||||
INSTANTIATE_BDA_FUNCTIONS(2);
|
||||
INSTANTIATE_BDA_FUNCTIONS(3);
|
||||
INSTANTIATE_BDA_FUNCTIONS(4);
|
||||
INSTANTIATE_BDA_FUNCTIONS(5);
|
||||
INSTANTIATE_BDA_FUNCTIONS(6);
|
||||
|
||||
#undef INSTANTIATE_BDA_FUNCTIONS
|
||||
|
||||
} // namespace Opm
|
||||
|
||||
|
||||
|
||||
@@ -478,6 +478,8 @@ INSTANTIATE_BDA_FUNCTIONS(1);
|
||||
INSTANTIATE_BDA_FUNCTIONS(2);
|
||||
INSTANTIATE_BDA_FUNCTIONS(3);
|
||||
INSTANTIATE_BDA_FUNCTIONS(4);
|
||||
INSTANTIATE_BDA_FUNCTIONS(5);
|
||||
INSTANTIATE_BDA_FUNCTIONS(6);
|
||||
|
||||
#undef INSTANTIATE_BDA_FUNCTIONS
|
||||
|
||||
|
||||
@@ -407,6 +407,8 @@ INSTANTIATE_BDA_FUNCTIONS(1);
|
||||
INSTANTIATE_BDA_FUNCTIONS(2);
|
||||
INSTANTIATE_BDA_FUNCTIONS(3);
|
||||
INSTANTIATE_BDA_FUNCTIONS(4);
|
||||
INSTANTIATE_BDA_FUNCTIONS(5);
|
||||
INSTANTIATE_BDA_FUNCTIONS(6);
|
||||
|
||||
#undef INSTANTIATE_BDA_FUNCTIONS
|
||||
|
||||
|
||||
@@ -726,6 +726,8 @@ INSTANTIATE_BDA_FUNCTIONS(1);
|
||||
INSTANTIATE_BDA_FUNCTIONS(2);
|
||||
INSTANTIATE_BDA_FUNCTIONS(3);
|
||||
INSTANTIATE_BDA_FUNCTIONS(4);
|
||||
INSTANTIATE_BDA_FUNCTIONS(5);
|
||||
INSTANTIATE_BDA_FUNCTIONS(6);
|
||||
|
||||
#undef INSTANTIATE_BDA_FUNCTIONS
|
||||
|
||||
|
||||
@@ -376,6 +376,8 @@ INSTANTIATE_BDA_FUNCTIONS(1);
|
||||
INSTANTIATE_BDA_FUNCTIONS(2);
|
||||
INSTANTIATE_BDA_FUNCTIONS(3);
|
||||
INSTANTIATE_BDA_FUNCTIONS(4);
|
||||
INSTANTIATE_BDA_FUNCTIONS(5);
|
||||
INSTANTIATE_BDA_FUNCTIONS(6);
|
||||
|
||||
#undef INSTANTIATE_BDA_FUNCTIONS
|
||||
|
||||
|
||||
@@ -376,8 +376,9 @@ INSTANTIATE_BDA_FUNCTIONS(1);
|
||||
INSTANTIATE_BDA_FUNCTIONS(2);
|
||||
INSTANTIATE_BDA_FUNCTIONS(3);
|
||||
INSTANTIATE_BDA_FUNCTIONS(4);
|
||||
INSTANTIATE_BDA_FUNCTIONS(5);
|
||||
INSTANTIATE_BDA_FUNCTIONS(6);
|
||||
|
||||
#undef INSTANTIATE_BDA_FUNCTIONS
|
||||
|
||||
} // namespace bda
|
||||
|
||||
|
||||
@@ -82,6 +82,8 @@ INSTANTIATE_BDA_FUNCTIONS(1);
|
||||
INSTANTIATE_BDA_FUNCTIONS(2);
|
||||
INSTANTIATE_BDA_FUNCTIONS(3);
|
||||
INSTANTIATE_BDA_FUNCTIONS(4);
|
||||
INSTANTIATE_BDA_FUNCTIONS(5);
|
||||
INSTANTIATE_BDA_FUNCTIONS(6);
|
||||
|
||||
#undef INSTANTIATE_BDA_FUNCTIONS
|
||||
|
||||
|
||||
@@ -506,6 +506,8 @@ INSTANTIATE_BDA_FUNCTIONS(1);
|
||||
INSTANTIATE_BDA_FUNCTIONS(2);
|
||||
INSTANTIATE_BDA_FUNCTIONS(3);
|
||||
INSTANTIATE_BDA_FUNCTIONS(4);
|
||||
INSTANTIATE_BDA_FUNCTIONS(5);
|
||||
INSTANTIATE_BDA_FUNCTIONS(6);
|
||||
|
||||
#undef INSTANTIATE_BDA_FUNCTIONS
|
||||
|
||||
|
||||
@@ -173,7 +173,7 @@ openclSolverBackend<block_size>::openclSolverBackend(int verbosity_, int maxit_,
|
||||
|
||||
context = std::make_shared<cl::Context>(devices[0]);
|
||||
queue.reset(new cl::CommandQueue(*context, devices[0], 0, &err));
|
||||
|
||||
|
||||
} catch (const cl::Error& error) {
|
||||
std::ostringstream oss;
|
||||
oss << "OpenCL Error: " << error.what() << "(" << error.err() << ")\n";
|
||||
@@ -812,8 +812,9 @@ INSTANTIATE_BDA_FUNCTIONS(1);
|
||||
INSTANTIATE_BDA_FUNCTIONS(2);
|
||||
INSTANTIATE_BDA_FUNCTIONS(3);
|
||||
INSTANTIATE_BDA_FUNCTIONS(4);
|
||||
INSTANTIATE_BDA_FUNCTIONS(5);
|
||||
INSTANTIATE_BDA_FUNCTIONS(6);
|
||||
|
||||
#undef INSTANTIATE_BDA_FUNCTIONS
|
||||
|
||||
} // namespace bda
|
||||
|
||||
|
||||
@@ -119,6 +119,7 @@ namespace Opm {
|
||||
static constexpr bool has_solvent_ = getPropValue<TypeTag, Properties::EnableSolvent>();
|
||||
static constexpr bool has_polymer_ = getPropValue<TypeTag, Properties::EnablePolymer>();
|
||||
static constexpr bool has_energy_ = getPropValue<TypeTag, Properties::EnableEnergy>();
|
||||
static constexpr bool has_micp_ = getPropValue<TypeTag, Properties::EnableMICP>();
|
||||
|
||||
// TODO: where we should put these types, WellInterface or Well Model?
|
||||
// or there is some other strategy, like TypeTag
|
||||
@@ -128,6 +129,7 @@ namespace Opm {
|
||||
typedef Dune::FieldMatrix<Scalar, numEq, numEq > MatrixBlockType;
|
||||
|
||||
typedef BlackOilPolymerModule<TypeTag> PolymerModule;
|
||||
typedef BlackOilMICPModule<TypeTag> MICPModule;
|
||||
|
||||
// For the conversion between the surface volume rate and resrevoir voidage rate
|
||||
using RateConverterType = RateConverter::
|
||||
|
||||
@@ -1852,26 +1852,27 @@ addWellContribution(WellContributions& wellContribs) const
|
||||
template class MultisegmentWellEval<BlackOilFluidSystem<double,A>,__VA_ARGS__,double>;
|
||||
|
||||
// One phase
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilOnePhaseIndices<0u,0u,0u,0u,false,false,0u,1u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilOnePhaseIndices<0u,0u,0u,1u,false,false,0u,1u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilOnePhaseIndices<0u,0u,0u,0u,false,false,0u,1u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilOnePhaseIndices<0u,0u,0u,1u,false,false,0u,1u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilOnePhaseIndices<0u,0u,0u,0u,false,false,0u,1u,5u>)
|
||||
|
||||
// Two phase
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,0u,0u,false,false,0u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,0u,0u,false,false,0u,1u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,0u,0u,false,false,0u,2u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,0u,0u,false,true,0u,2u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,1u,0u,false,false,0u,2u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,2u,0u,false,false,0u,2u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,0u,0u,false,false,0u,0u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,0u,0u,false,false,0u,1u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,0u,0u,false,false,0u,2u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,0u,0u,false,true,0u,2u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,1u,0u,false,false,0u,2u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,2u,0u,false,false,0u,2u,0u>)
|
||||
|
||||
// Blackoil
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,0u,false,false,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,0u,true,false,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,0u,false,true,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,0u,false,true,2u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<1u,0u,0u,0u,false,false,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,1u,0u,0u,false,false,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,1u,0u,false,false,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,1u,false,false,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,0u,false,false,1u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,0u,false,false,0u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,0u,true,false,0u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,0u,false,true,0u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,0u,false,true,2u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<1u,0u,0u,0u,false,false,0u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,1u,0u,0u,false,false,0u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,1u,0u,false,false,0u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,1u,false,false,0u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,0u,false,false,1u,0u>)
|
||||
|
||||
} // namespace Opm
|
||||
|
||||
@@ -37,6 +37,7 @@ PerfData::PerfData(std::size_t num_perf, bool injector_, std::size_t num_phases)
|
||||
, connection_transmissibility_factor(num_perf)
|
||||
, satnum_id(num_perf)
|
||||
, ecl_index(num_perf)
|
||||
, micp_rates(num_perf)
|
||||
{
|
||||
if (injector) {
|
||||
this->water_throughput.resize(num_perf);
|
||||
@@ -70,8 +71,8 @@ bool PerfData::try_assign(const PerfData& other) {
|
||||
this->skin_pressure = other.skin_pressure;
|
||||
this->water_velocity = other.water_velocity;
|
||||
this->prod_index = other.prod_index;
|
||||
this->micp_rates = other.micp_rates;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -45,6 +45,7 @@ public:
|
||||
std::vector<double> polymer_rates;
|
||||
std::vector<double> brine_rates;
|
||||
std::vector<double> prod_index;
|
||||
std::vector<double> micp_rates;
|
||||
|
||||
std::vector<std::size_t> cell_index;
|
||||
std::vector<double> connection_transmissibility_factor;
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
#include <opm/models/blackoil/blackoilextbomodules.hh>
|
||||
#include <opm/models/blackoil/blackoilfoammodules.hh>
|
||||
#include <opm/models/blackoil/blackoilbrinemodules.hh>
|
||||
#include <opm/models/blackoil/blackoilmicpmodules.hh>
|
||||
|
||||
#include <opm/material/densead/DynamicEvaluation.hpp>
|
||||
#include <opm/parser/eclipse/EclipseState/Runspec.hpp>
|
||||
@@ -95,6 +96,7 @@ namespace Opm
|
||||
using Base::has_foam;
|
||||
using Base::has_brine;
|
||||
using Base::has_energy;
|
||||
using Base::has_micp;
|
||||
|
||||
using PolymerModule = BlackOilPolymerModule<TypeTag>;
|
||||
using FoamModule = BlackOilFoamModule<TypeTag>;
|
||||
|
||||
@@ -88,13 +88,13 @@ relaxationFactorFractionsProducer(const std::vector<double>& primary_variables,
|
||||
double relaxation_factor = 1.0;
|
||||
|
||||
if (FluidSystem::numActivePhases() > 1) {
|
||||
if constexpr (has_wfrac_variable) {
|
||||
if constexpr (has_wfrac_variable) {
|
||||
const double relaxation_factor_w = StandardWellGeneric<Scalar>::
|
||||
relaxationFactorFraction(primary_variables[WFrac], dwells[0][WFrac]);
|
||||
relaxation_factor = std::min(relaxation_factor, relaxation_factor_w);
|
||||
}
|
||||
|
||||
if constexpr (has_gfrac_variable) {
|
||||
if constexpr (has_gfrac_variable) {
|
||||
const double relaxation_factor_g = StandardWellGeneric<Scalar>::
|
||||
relaxationFactorFraction(primary_variables[GFrac], dwells[0][GFrac]);
|
||||
relaxation_factor = std::min(relaxation_factor, relaxation_factor_g);
|
||||
@@ -329,11 +329,11 @@ updatePrimaryVariables(const WellState& well_state, DeferredLogger& deferred_log
|
||||
// this will happen.
|
||||
} else if (baseif_.isProducer()) { // producers
|
||||
// TODO: the following are not addressed for the solvent case yet
|
||||
if constexpr (has_wfrac_variable) {
|
||||
if constexpr (has_wfrac_variable) {
|
||||
primary_variables_[WFrac] = 1.0 / np;
|
||||
}
|
||||
|
||||
if constexpr (has_gfrac_variable) {
|
||||
|
||||
if constexpr (has_gfrac_variable) {
|
||||
primary_variables_[GFrac] = 1.0 / np;
|
||||
}
|
||||
} else {
|
||||
@@ -534,12 +534,12 @@ processFractions() const
|
||||
F[pu.phase_pos[Oil]] = 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
if constexpr (has_wfrac_variable) {
|
||||
|
||||
if constexpr (has_wfrac_variable) {
|
||||
primary_variables_[WFrac] = F[pu.phase_pos[Water]];
|
||||
}
|
||||
|
||||
if constexpr (has_gfrac_variable) {
|
||||
|
||||
if constexpr (has_gfrac_variable) {
|
||||
primary_variables_[GFrac] = F[pu.phase_pos[Gas]];
|
||||
}
|
||||
if constexpr (Indices::enableSolvent) {
|
||||
@@ -732,7 +732,7 @@ updatePrimaryVariablesNewton(const BVectorWell& dwells,
|
||||
: 1.0;
|
||||
|
||||
// update the second and third well variable (The flux fractions)
|
||||
|
||||
|
||||
if constexpr (has_wfrac_variable) {
|
||||
const int sign2 = dwells[0][WFrac] > 0 ? 1: -1;
|
||||
const double dx2_limited = sign2 * std::min(std::abs(dwells[0][WFrac] * relaxation_factor_fractions), dFLimit);
|
||||
@@ -740,7 +740,7 @@ updatePrimaryVariablesNewton(const BVectorWell& dwells,
|
||||
primary_variables_[WFrac] = old_primary_variables[WFrac] - dx2_limited;
|
||||
}
|
||||
|
||||
if constexpr (has_gfrac_variable) {
|
||||
if constexpr (has_gfrac_variable) {
|
||||
const int sign3 = dwells[0][GFrac] > 0 ? 1: -1;
|
||||
const double dx3_limited = sign3 * std::min(std::abs(dwells[0][GFrac] * relaxation_factor_fractions), dFLimit);
|
||||
primary_variables_[GFrac] = old_primary_variables[GFrac] - dx3_limited;
|
||||
@@ -1110,26 +1110,27 @@ addWellContribution(WellContributions& wellContribs) const
|
||||
template class StandardWellEval<BlackOilFluidSystem<double,A>,__VA_ARGS__,double>;
|
||||
|
||||
// One phase
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilOnePhaseIndices<0u,0u,0u,0u,false,false,0u,1u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilOnePhaseIndices<0u,0u,0u,1u,false,false,0u,1u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilOnePhaseIndices<0u,0u,0u,0u,false,false,0u,1u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilOnePhaseIndices<0u,0u,0u,1u,false,false,0u,1u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilOnePhaseIndices<0u,0u,0u,0u,false,false,0u,1u,5u>)
|
||||
|
||||
// Two phase
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,0u,0u,false,false,0u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,0u,0u,false,false,0u,1u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,0u,0u,false,false,0u,2u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,0u,0u,false,true,0u,2u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,1u,0u,false,false,0u,2u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,1u,0u,false,true,0u,2u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,2u,0u,false,false,0u,2u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,0u,0u,false,false,0u,0u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,0u,0u,false,false,0u,1u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,0u,0u,false,false,0u,2u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,0u,0u,false,true,0u,2u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,1u,0u,false,false,0u,2u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,1u,0u,false,true,0u,2u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,2u,0u,false,false,0u,2u,0u>)
|
||||
|
||||
// Blackoil
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,0u,false,false,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,0u,true,false,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,0u,false,true,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<1u,0u,0u,0u,false,false,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,1u,0u,0u,false,false,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,1u,0u,false,false,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,1u,false,false,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,1u,false,false,1u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,0u,false,false,0u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,0u,true,false,0u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,0u,false,true,0u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<1u,0u,0u,0u,false,false,0u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,1u,0u,0u,false,false,0u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,1u,0u,false,false,0u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,1u,false,false,0u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,1u,false,false,1u,0u>)
|
||||
|
||||
}
|
||||
|
||||
@@ -694,6 +694,31 @@ namespace Opm
|
||||
connectionRates[perf][Indices::contiBrineEqIdx] = Base::restrictEval(cq_s_sm);
|
||||
}
|
||||
|
||||
if constexpr (has_micp) {
|
||||
const unsigned waterCompIdx = Indices::canonicalToActiveComponentIndex(FluidSystem::waterCompIdx);
|
||||
EvalWell cq_s_microbe = cq_s[waterCompIdx];
|
||||
if (this->isInjector()) {
|
||||
cq_s_microbe *= this->wmicrobes();
|
||||
} else {
|
||||
cq_s_microbe *= this->extendEval(intQuants.microbialConcentration());
|
||||
}
|
||||
connectionRates[perf][Indices::contiMicrobialEqIdx] = Base::restrictEval(cq_s_microbe);
|
||||
EvalWell cq_s_oxygen = cq_s[waterCompIdx];
|
||||
if (this->isInjector()) {
|
||||
cq_s_oxygen *= this->woxygen();
|
||||
} else {
|
||||
cq_s_oxygen *= this->extendEval(intQuants.oxygenConcentration());
|
||||
}
|
||||
connectionRates[perf][Indices::contiOxygenEqIdx] = Base::restrictEval(cq_s_oxygen);
|
||||
EvalWell cq_s_urea = cq_s[waterCompIdx];
|
||||
if (this->isInjector()) {
|
||||
cq_s_urea *= this->wurea();
|
||||
} else {
|
||||
cq_s_urea *= this->extendEval(intQuants.ureaConcentration());
|
||||
}
|
||||
connectionRates[perf][Indices::contiUreaEqIdx] = Base::restrictEval(cq_s_urea);
|
||||
}
|
||||
|
||||
// Store the perforation pressure for later usage.
|
||||
perf_data.pressure[perf] = ws.bhp + this->perf_pressure_diffs_[perf];
|
||||
}
|
||||
@@ -1323,7 +1348,7 @@ namespace Opm
|
||||
{
|
||||
// the following implementation assume that the polymer is always after the w-o-g phases
|
||||
// For the polymer, energy and foam cases, there is one more mass balance equations of reservoir than wells
|
||||
assert((int(B_avg.size()) == this->num_components_) || has_polymer || has_energy || has_foam || has_brine || has_zFraction);
|
||||
assert((int(B_avg.size()) == this->num_components_) || has_polymer || has_energy || has_foam || has_brine || has_zFraction || has_micp);
|
||||
|
||||
std::vector<double> res;
|
||||
ConvergenceReport report = this->StdWellEval::getWellConvergence(well_state,
|
||||
|
||||
@@ -112,8 +112,9 @@ public:
|
||||
static constexpr bool has_polymermw = getPropValue<TypeTag, Properties::EnablePolymerMW>();
|
||||
static constexpr bool has_foam = getPropValue<TypeTag, Properties::EnableFoam>();
|
||||
static constexpr bool has_brine = getPropValue<TypeTag, Properties::EnableBrine>();
|
||||
static constexpr bool has_micp = getPropValue<TypeTag, Properties::EnableMICP>();
|
||||
|
||||
// For the conversion between the surface volume rate and reservoir voidage rate
|
||||
// For the conversion between the surface volume rate and reservoir voidage rate
|
||||
using FluidState = BlackOilFluidState<Eval,
|
||||
FluidSystem,
|
||||
has_temperature,
|
||||
@@ -286,6 +287,12 @@ protected:
|
||||
|
||||
double wsalt() const;
|
||||
|
||||
double wmicrobes() const;
|
||||
|
||||
double woxygen() const;
|
||||
|
||||
double wurea() const;
|
||||
|
||||
virtual double getRefDensity() const = 0;
|
||||
|
||||
// Component fractions for each phase for the well
|
||||
|
||||
@@ -117,28 +117,29 @@ template class WellInterfaceIndices<BlackOilFluidSystem<double, A>, \
|
||||
double>;
|
||||
|
||||
// One phase
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilOnePhaseIndices<0u,0u,0u,0u,false,false,0u,1u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilOnePhaseIndices<0u,0u,0u,1u,false,false,0u,1u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilOnePhaseIndices<0u,0u,0u,0u,false,false,0u,1u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilOnePhaseIndices<0u,0u,0u,1u,false,false,0u,1u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilOnePhaseIndices<0u,0u,0u,0u,false,false,0u,1u,5u>)
|
||||
|
||||
// Two phase
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,0u,0u,false,false,0u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,0u,0u,false,false,0u,1u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,0u,0u,false,false,0u,2u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,1u,0u,false,false,0u,2u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,2u,0u,false,false,0u,2u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,0u,0u,false,true,0u,2u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,1u,0u,false,true,0u,2u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,0u,0u,false,false,0u,0u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,0u,0u,false,false,0u,1u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,0u,0u,false,false,0u,2u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,1u,0u,false,false,0u,2u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,2u,0u,false,false,0u,2u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,0u,0u,false,true,0u,2u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilTwoPhaseIndices<0u,0u,1u,0u,false,true,0u,2u,0u>)
|
||||
|
||||
// Blackoil
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,0u,false,false,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,0u,true,false,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,0u,false,true,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,0u,false,true,2u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<1u,0u,0u,0u,false,false,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,1u,0u,0u,false,false,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,1u,0u,false,false,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,1u,false,false,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,1u,false,false,1u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,0u,false,false,1u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,0u,false,false,0u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,0u,true,false,0u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,0u,false,true,0u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,0u,false,true,2u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<1u,0u,0u,0u,false,false,0u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,1u,0u,0u,false,false,0u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,1u,0u,false,false,0u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,1u,false,false,0u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,1u,false,false,1u,0u>)
|
||||
INSTANCE(BlackOilDefaultIndexTraits,BlackOilIndices<0u,0u,0u,0u,false,false,1u,0u>)
|
||||
|
||||
} // namespace Opm
|
||||
|
||||
@@ -149,6 +149,74 @@ namespace Opm
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
template<typename TypeTag>
|
||||
double
|
||||
WellInterface<TypeTag>::
|
||||
wmicrobes() const
|
||||
{
|
||||
if constexpr (has_micp) {
|
||||
auto injectorType = this->well_ecl_.injectorType();
|
||||
|
||||
if (injectorType == InjectorType::WATER) {
|
||||
WellMICPProperties microbes = this->well_ecl_.getMICPProperties();
|
||||
const double microbial_injection_concentration = microbes.m_microbialConcentration;
|
||||
return microbial_injection_concentration;
|
||||
} else {
|
||||
// Not a water injection well => no microbes.
|
||||
return 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
template<typename TypeTag>
|
||||
double
|
||||
WellInterface<TypeTag>::
|
||||
woxygen() const
|
||||
{
|
||||
if constexpr (has_micp) {
|
||||
auto injectorType = this->well_ecl_.injectorType();
|
||||
|
||||
if (injectorType == InjectorType::WATER) {
|
||||
WellMICPProperties oxygen = this->well_ecl_.getMICPProperties();
|
||||
const double oxygen_injection_concentration = oxygen.m_oxygenConcentration;
|
||||
return oxygen_injection_concentration;
|
||||
} else {
|
||||
// Not a water injection well => no oxygen.
|
||||
return 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
// The urea injection concentration is scaled down by a factor of 10, since its value
|
||||
// can be much bigger than 1 (not doing this slows the simulations). The
|
||||
// corresponding values are scaled accordingly in blackoilmicpmodules.hh when computing
|
||||
// the reactions and also when writing the output files (vtk and eclipse format, i.e.,
|
||||
// vtkblackoilmicpmodule.hh and ecloutputblackoilmodel.hh respectively).
|
||||
|
||||
template<typename TypeTag>
|
||||
double
|
||||
WellInterface<TypeTag>::
|
||||
wurea() const
|
||||
{
|
||||
if constexpr (has_micp) {
|
||||
auto injectorType = this->well_ecl_.injectorType();
|
||||
|
||||
if (injectorType == InjectorType::WATER) {
|
||||
WellMICPProperties urea = this->well_ecl_.getMICPProperties();
|
||||
const double urea_injection_concentration = urea.m_ureaConcentration / 10.; //Dividing by scaling factor 10
|
||||
return urea_injection_concentration;
|
||||
} else {
|
||||
// Not a water injection well => no urea.
|
||||
return 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
template<typename TypeTag>
|
||||
bool
|
||||
|
||||
Reference in New Issue
Block a user