Support deactivation of individual DRSDT/DRVDT/DRSDTCON regions

This commit is contained in:
Tor Harald Sandve 2024-06-05 14:56:39 +02:00
parent 908a9b37ff
commit 914f0b8644
3 changed files with 56 additions and 23 deletions

View File

@ -1943,8 +1943,7 @@ protected:
this->gravity_[dim - 1], this->gravity_[dim - 1],
perm[dim - 1][dim - 1], perm[dim - 1][dim - 1],
distZ, distZ,
pvtRegionIdx, pvtRegionIdx);
active);
} }
); );

View File

@ -137,22 +137,49 @@ drsdtConvective(int episodeIdx) const
return (oilVaporizationControl.drsdtConvective()); return (oilVaporizationControl.drsdtConvective());
} }
template<class FluidSystem>
bool MixingRateControls<FluidSystem>::
drsdtActive(int episodeIdx, std::size_t pvtRegionIdx) const
{
const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap();
return (oilVaporizationControl.drsdtActive(pvtRegionIdx));
}
template<class FluidSystem>
bool MixingRateControls<FluidSystem>::
drvdtActive(int episodeIdx, std::size_t pvtRegionIdx) const
{
const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap();
return (oilVaporizationControl.drvdtActive(pvtRegionIdx));
}
template<class FluidSystem>
bool MixingRateControls<FluidSystem>::
drsdtConvective(int episodeIdx, std::size_t pvtRegionIdx) const
{
const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap();
return (oilVaporizationControl.drsdtConvective(pvtRegionIdx));
}
template<class FluidSystem> template<class FluidSystem>
void MixingRateControls<FluidSystem>:: void MixingRateControls<FluidSystem>::
updateExplicitQuantities(const int episodeIdx, updateExplicitQuantities(const int episodeIdx,
const Scalar timeStepSize) const Scalar timeStepSize)
{ {
const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap(); const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap();
if (this->drsdtActive(episodeIdx)) { // DRSDT is enabled
// DRSDT is enabled for (std::size_t pvtRegionIdx = 0; pvtRegionIdx < maxDRs_.size(); ++pvtRegionIdx) {
for (std::size_t pvtRegionIdx = 0; pvtRegionIdx < maxDRs_.size(); ++pvtRegionIdx) if (this->drsdtActive(episodeIdx, pvtRegionIdx)) {
maxDRs_[pvtRegionIdx] = oilVaporizationControl.getMaxDRSDT(pvtRegionIdx) * timeStepSize; maxDRs_[pvtRegionIdx] = oilVaporizationControl.getMaxDRSDT(pvtRegionIdx) * timeStepSize;
}
} }
if (this->drvdtActive(episodeIdx)) { // DRVDT is enabled
// DRVDT is enabled for (std::size_t pvtRegionIdx = 0; pvtRegionIdx < maxDRv_.size(); ++pvtRegionIdx) {
for (std::size_t pvtRegionIdx = 0; pvtRegionIdx < maxDRv_.size(); ++pvtRegionIdx) if (this->drvdtActive(episodeIdx, pvtRegionIdx)) {
maxDRv_[pvtRegionIdx] = oilVaporizationControl.getMaxDRVDT(pvtRegionIdx) * timeStepSize; maxDRv_[pvtRegionIdx] = oilVaporizationControl.getMaxDRVDT(pvtRegionIdx) * timeStepSize;
}
} }
} }
@ -177,16 +204,16 @@ updateMaxValues(const int episodeIdx,
const Scalar timeStepSize) const Scalar timeStepSize)
{ {
const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap(); const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap();
if (this->drsdtActive(episodeIdx)) { // DRSDT is enabled
// DRSDT is enabled for (std::size_t pvtRegionIdx = 0; pvtRegionIdx < maxDRs_.size(); ++pvtRegionIdx) {
for (std::size_t pvtRegionIdx = 0; pvtRegionIdx < maxDRs_.size(); ++pvtRegionIdx) { if (this->drsdtActive(episodeIdx, pvtRegionIdx)) {
maxDRs_[pvtRegionIdx] = oilVaporizationControl.getMaxDRSDT(pvtRegionIdx) * timeStepSize; maxDRs_[pvtRegionIdx] = oilVaporizationControl.getMaxDRSDT(pvtRegionIdx) * timeStepSize;
} }
} }
if (this->drvdtActive(episodeIdx)) { // DRVDT is enabled
// DRVDT is enabled for (std::size_t pvtRegionIdx = 0; pvtRegionIdx < maxDRv_.size(); ++pvtRegionIdx) {
for (std::size_t pvtRegionIdx = 0; pvtRegionIdx < maxDRv_.size(); ++pvtRegionIdx) { if (this->drvdtActive(episodeIdx, pvtRegionIdx)) {
maxDRv_[pvtRegionIdx] = oilVaporizationControl.getMaxDRVDT(pvtRegionIdx) * timeStepSize; maxDRv_[pvtRegionIdx] = oilVaporizationControl.getMaxDRVDT(pvtRegionIdx) * timeStepSize;
} }
} }
@ -207,6 +234,10 @@ drsdtcon(const unsigned elemIdx,
// Output drsdt value for index 0 // Output drsdt value for index 0
episodeIdx = std::max(episodeIdx, 0); episodeIdx = std::max(episodeIdx, 0);
const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap(); const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap();
if (!oilVaporizationControl.drsdtConvective(pvtRegionIdx))
return 0;
return oilVaporizationControl.getMaxDRSDT(pvtRegionIdx) * convectiveDrs_[elemIdx]; return oilVaporizationControl.getMaxDRSDT(pvtRegionIdx) * convectiveDrs_[elemIdx];
} }
@ -218,12 +249,12 @@ maxGasDissolutionFactor(const unsigned timeIdx,
const int episodeIdx, const int episodeIdx,
const int pvtRegionIdx) const const int pvtRegionIdx) const
{ {
if (!this->drsdtActive(episodeIdx) || maxDRs_[pvtRegionIdx] < 0.0) { if (!this->drsdtActive(episodeIdx, pvtRegionIdx) || maxDRs_[pvtRegionIdx] < 0.0) {
return std::numeric_limits<Scalar>::max() / 2.0; return std::numeric_limits<Scalar>::max() / 2.0;
} }
Scalar scaling = 1.0; Scalar scaling = 1.0;
if (this->drsdtConvective(episodeIdx)) { if (this->drsdtConvective(episodeIdx, pvtRegionIdx)) {
scaling = convectiveDrs_[globalDofIdx]; scaling = convectiveDrs_[globalDofIdx];
} }
@ -244,7 +275,7 @@ maxOilVaporizationFactor(const unsigned timeIdx,
const int episodeIdx, const int episodeIdx,
const int pvtRegionIdx) const const int pvtRegionIdx) const
{ {
if (!this->drvdtActive(episodeIdx) || maxDRv_[pvtRegionIdx] < 0.0) { if (!this->drvdtActive(episodeIdx, pvtRegionIdx) || maxDRv_[pvtRegionIdx] < 0.0) {
return std::numeric_limits<Scalar>::max() / 2.0; return std::numeric_limits<Scalar>::max() / 2.0;
} }

View File

@ -61,6 +61,9 @@ public:
bool drvdtActive(int episodeIdx) const; bool drvdtActive(int episodeIdx) const;
bool drsdtConvective(int episodeIdx) const; bool drsdtConvective(int episodeIdx) const;
bool drsdtActive(int episodeIdx, std::size_t pvtRegionIdx) const;
bool drvdtActive(int episodeIdx, std::size_t pvtRegionIdx) const;
bool drsdtConvective(int episodeIdx, std::size_t pvtRegionIdx) const;
/*! /*!
* \brief Returns the dynamic drsdt convective mixing value * \brief Returns the dynamic drsdt convective mixing value
*/ */
@ -114,11 +117,11 @@ public:
const Scalar gravity, const Scalar gravity,
const Scalar permZ, const Scalar permZ,
const Scalar distZ, const Scalar distZ,
const int pvtRegionIdx, const int pvtRegionIdx)
const std::array<bool,3>& active)
{ {
const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap(); const auto& oilVaporizationControl = schedule_[episodeIdx].oilvap();
if (active[0]) {
if (oilVaporizationControl.drsdtConvective(pvtRegionIdx)) {
// This implements the convective DRSDT as described in // This implements the convective DRSDT as described in
// Sandve et al. "Convective dissolution in field scale CO2 storage simulations using the OPM Flow // Sandve et al. "Convective dissolution in field scale CO2 storage simulations using the OPM Flow
// simulator" Submitted to TCCS 11, 2021 // simulator" Submitted to TCCS 11, 2021
@ -155,7 +158,7 @@ public:
fs.pvtRegionIndex()); fs.pvtRegionIndex());
} }
if (active[1]) { if (oilVaporizationControl.drsdtActive(pvtRegionIdx)) {
const auto& fs = iq.fluidState(); const auto& fs = iq.fluidState();
using FluidState = typename std::decay<decltype(fs)>::type; using FluidState = typename std::decay<decltype(fs)>::type;
@ -171,7 +174,7 @@ public:
lastRs_[compressedDofIdx] = std::numeric_limits<Scalar>::infinity(); lastRs_[compressedDofIdx] = std::numeric_limits<Scalar>::infinity();
} }
if (active[2]) { if (oilVaporizationControl.drvdtActive(pvtRegionIdx)) {
const auto& fs = iq.fluidState(); const auto& fs = iq.fluidState();
using FluidState = typename std::decay<decltype(fs)>::type; using FluidState = typename std::decay<decltype(fs)>::type;
lastRv_[compressedDofIdx] lastRv_[compressedDofIdx]