Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Add HU simplified 2-phase version, refactor IHU implementation and fix bugs where possible, change phase/component flux logic #3401

Open
wants to merge 110 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
110 commits
Select commit Hold shift + click to select a range
d83a609
move into folder and clean up includes
Sep 25, 2024
9d9915c
Remove duplicates of NoOpFunc
Sep 25, 2024
fde7cab
Update SinglePhasePoromechanicsEmbeddedFractures.hpp
paveltomin Sep 25, 2024
d2c590b
more move into subfolders
Sep 25, 2024
ffc24fe
split FlowSolverBaseKernels.hpp
Sep 26, 2024
451b40a
rename
Sep 26, 2024
d00af05
Merge branch 'develop' into pt/flow-kernels-folder
paveltomin Sep 26, 2024
2ce059c
split SinglePhaseBaseKernels.hpp
Sep 26, 2024
6d25f34
Merge branch 'pt/flow-kernels-folder' into pt/remove-noopfunc-duplicates
paveltomin Sep 26, 2024
e20b031
thermal base
Sep 26, 2024
f4bd0f7
rename
Sep 26, 2024
f84dfc3
thermal flux
Sep 26, 2024
616724a
last things
Sep 26, 2024
c30034e
Merge branch 'develop' into pt/flow-kernels-split
paveltomin Sep 26, 2024
9f133ea
remove
Sep 26, 2024
93f76ef
missing file
Sep 26, 2024
3cc1446
code style
Sep 26, 2024
3e6c238
unused
Sep 26, 2024
8527f35
unused
Sep 26, 2024
2ba3f8e
cuda build
Sep 27, 2024
4e9ffab
try this
Sep 27, 2024
e4edeeb
revert to avoid cuda errors
Sep 27, 2024
7255e9d
first pass for compositional
Sep 28, 2024
f78b597
Merge branch 'pt/remove-noopfunc-duplicates' into pt/flow-kernels-split
paveltomin Sep 28, 2024
da6ed32
isothermal accum kernel
Sep 28, 2024
1ebcd9a
thermal accum
Sep 28, 2024
ee44033
flux helpers
Sep 28, 2024
0aa4f12
more or less ready
Sep 28, 2024
c5f4901
some includes cleanup
Sep 29, 2024
890af39
includes cleanup and code style
Sep 30, 2024
695b4e2
crash fix
Sep 30, 2024
efc864f
Merge branch 'pt/flow-kernels-split' into pt/flow-kernel-comp-split
paveltomin Sep 30, 2024
7f3d622
Merge remote-tracking branch 'origin/develop' into pt/flow-kernels-fo…
Oct 3, 2024
042c3ee
Merge remote-tracking branch 'origin/develop' into pt/flow-kernels-fo…
Oct 15, 2024
fb41429
Merge branch 'pt/flow-kernels-folder' into pt/remove-noopfunc-duplicates
paveltomin Oct 15, 2024
5d69959
Merge remote-tracking branch 'origin/pt/remove-noopfunc-duplicates' i…
Oct 15, 2024
683733e
build fix
Oct 15, 2024
8035b8c
Merge branch 'pt/flow-kernels-split' into pt/flow-kernel-comp-split
Oct 15, 2024
86952e8
2-phase simplified version of HU
Oct 16, 2024
d1d113c
make it able to run
Oct 16, 2024
5423f89
debug and some bug fixes
Oct 16, 2024
5ef0eea
wip
Oct 18, 2024
e4a6465
some bug fixes
Oct 18, 2024
4b46fee
missing file
Oct 18, 2024
188f5db
wip
Oct 19, 2024
d800f67
try to clean up
Oct 21, 2024
abc4e27
Merge branch 'develop' into pt/flow-kernels-folder
paveltomin Oct 25, 2024
c9e8b07
Merge branch 'pt/flow-kernels-folder' into pt/remove-noopfunc-duplicates
paveltomin Oct 25, 2024
3a07987
Merge branch 'pt/remove-noopfunc-duplicates' into pt/flow-kernels-split
paveltomin Oct 25, 2024
a5115a8
Merge branch 'pt/flow-kernels-split' into pt/flow-kernel-comp-split
paveltomin Oct 25, 2024
647b273
wip
Oct 28, 2024
c2e290f
Merge remote-tracking branch 'origin/develop' into pt/flow-kernels-fo…
Oct 28, 2024
70b5857
Merge branch 'pt/flow-kernels-folder' into pt/remove-noopfunc-duplicates
paveltomin Oct 28, 2024
31eee96
Merge remote-tracking branch 'origin/pt/remove-noopfunc-duplicates' i…
Oct 28, 2024
1f57fd8
Merge remote-tracking branch 'origin/pt/flow-kernels-split' into pt/f…
Oct 28, 2024
604578e
Merge branch 'pt/flow-kernel-comp-split' into pt/hu-2phase
paveltomin Oct 28, 2024
9852365
Merge branch 'pt/hu-2phase' of https://github.com/GEOS-DEV/GEOS into …
Oct 28, 2024
6bdb951
cap flux
Oct 28, 2024
c331044
some cleanup
Oct 28, 2024
a41abed
Update HU2PhaseFlux.hpp
paveltomin Oct 28, 2024
48bdee6
fix total mobility bug for IHU and simplify viscosu part logic
Oct 29, 2024
3bc9523
revert
Oct 30, 2024
64e6b22
clean up a bit
Oct 30, 2024
dcf0c9c
try to re-use the code
Oct 30, 2024
d0252ef
code style
Oct 30, 2024
7726a03
restore old behavior
Oct 31, 2024
c723c28
restore tests
Oct 31, 2024
c7e229a
throw an error
Oct 31, 2024
8680576
bug fix
Nov 1, 2024
dabc5cd
Merge branch 'pt/flow-kernels-split' into pt/flow-kernel-comp-split
paveltomin Nov 1, 2024
418f665
Merge branch 'pt/flow-kernel-comp-split' into pt/hu-2phase
paveltomin Nov 1, 2024
c2a20f4
code style
Nov 1, 2024
a40ef9f
flip
Nov 4, 2024
f17aa9a
Merge remote-tracking branch 'origin/develop' into pt/flow-kernels-fo…
Nov 4, 2024
ab71fca
Merge branch 'pt/flow-kernels-folder' into pt/remove-noopfunc-duplicates
paveltomin Nov 4, 2024
7d15d4e
Merge remote-tracking branch 'origin/pt/remove-noopfunc-duplicates' i…
Nov 4, 2024
3b3cec9
Merge remote-tracking branch 'origin/pt/flow-kernels-split' into pt/f…
Nov 4, 2024
f9a1006
Merge remote-tracking branch 'origin/develop' into pt/flow-kernels-fo…
Nov 5, 2024
1e5821b
Merge branch 'pt/flow-kernels-folder' into pt/remove-noopfunc-duplicates
paveltomin Nov 5, 2024
cd88ff2
Merge branch 'develop' into pt/remove-noopfunc-duplicates
paveltomin Nov 5, 2024
28657ae
Merge remote-tracking branch 'origin/pt/remove-noopfunc-duplicates' i…
Nov 6, 2024
407f4ea
Merge remote-tracking branch 'origin/develop' into pt/flow-kernels-split
Nov 6, 2024
612ce7b
Merge remote-tracking branch 'origin/pt/flow-kernels-split' into pt/f…
Nov 6, 2024
10d7f12
Merge branch 'pt/flow-kernel-comp-split' into pt/hu-2phase
paveltomin Nov 7, 2024
5768a8c
bug fix
Nov 7, 2024
1c5609b
Merge remote-tracking branch 'origin/develop' into pt/flow-kernels-split
Nov 8, 2024
38cc1b5
Merge remote-tracking branch 'origin/pt/flow-kernels-split' into pt/f…
Nov 8, 2024
89567bc
Merge remote-tracking branch 'origin/pt/flow-kernel-comp-split' into …
Nov 8, 2024
6ea1514
Merge branch 'develop' into pt/flow-kernels-split
paveltomin Nov 9, 2024
f6ac68f
Merge branch 'pt/flow-kernels-split' into pt/flow-kernel-comp-split
paveltomin Nov 9, 2024
4b9a7b3
bugfix
Nov 9, 2024
ed8a419
Merge branch 'pt/flow-kernels-split' into pt/flow-kernel-comp-split
paveltomin Nov 9, 2024
45ff2af
Merge branch 'pt/flow-kernel-comp-split' into pt/hu-2phase
paveltomin Nov 9, 2024
b7956a1
code style
Nov 9, 2024
6ed8fd7
Merge remote-tracking branch 'origin/develop' into pt/hu-2phase
Nov 11, 2024
2562b52
sync with new density treatment for gravity
Nov 12, 2024
49cd55a
Merge branch 'develop' into pt/hu-2phase
paveltomin Nov 17, 2024
b0cd8ff
Merge branch 'develop' into pt/hu-2phase
paveltomin Nov 21, 2024
4c008c2
Merge branch 'develop' into pt/hu-2phase
paveltomin Nov 22, 2024
f55d40e
Merge remote-tracking branch 'origin/develop' into pt/hu-2phase
Dec 23, 2024
8bfe9c5
Merge branch 'develop' into pt/hu-2phase
paveltomin Jan 8, 2025
6eba544
build fix
Jan 8, 2025
9833264
Merge branch 'develop' into pt/hu-2phase
paveltomin Jan 13, 2025
be8dfca
Merge branch 'develop' into pt/hu-2phase
paveltomin Jan 15, 2025
22cfb2e
sync gravity thing
Jan 15, 2025
5e0ffdd
code style
Jan 15, 2025
b22512c
Merge remote-tracking branch 'origin/develop' into pt/hu-2phase
Jan 17, 2025
6edaccd
Merge branch 'develop' into pt/hu-2phase
paveltomin Jan 22, 2025
d4efed1
Merge branch 'develop' into pt/hu-2phase
paveltomin Jan 28, 2025
e0483b0
Merge branch 'develop' into pt/hu-2phase
paveltomin Feb 1, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions src/coreComponents/finiteVolume/FluxApproximationBase.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@ enum class UpwindingScheme : integer
{
PPU, ///< PPU upwinding
C1PPU, ///< C1-PPU upwinding from https://doi.org/10.1016/j.advwatres.2017.07.028
IHU ///< IHU as in https://link.springer.com/content/pdf/10.1007/s10596-019-09835-6.pdf
IHU, ///< IHU as in https://link.springer.com/content/pdf/10.1007/s10596-019-09835-6.pdf
HU2PH ///< HU simplified 2-phase version
};

/**
Expand All @@ -48,7 +49,8 @@ enum class UpwindingScheme : integer
ENUM_STRINGS( UpwindingScheme,
"PPU",
"C1PPU",
"IHU" );
"IHU",
"HU2PH" );

/**
* @struct UpwindingParameters
Expand All @@ -57,7 +59,7 @@ ENUM_STRINGS( UpwindingScheme,
*/
struct UpwindingParameters
{
/// PPU or C1-PPU or IHU
/// PPU or C1-PPU or IHU or HU2PH
UpwindingScheme upwindingScheme;

/// C1-PPU smoothing tolerance
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ set( physicsSolvers_headers
fluidFlow/kernels/compositional/GlobalComponentFractionKernel.hpp
fluidFlow/kernels/compositional/HydrostaticPressureKernel.hpp
fluidFlow/kernels/compositional/IHUPhaseFlux.hpp
fluidFlow/kernels/compositional/HU2PhaseFlux.hpp
fluidFlow/kernels/compositional/KernelLaunchSelectors.hpp
fluidFlow/kernels/compositional/PhaseComponentFlux.hpp
fluidFlow/kernels/compositional/PhaseMobilityKernel.hpp
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,14 @@ void CompositionalMultiphaseFVM::initializePreSubGroups()
: LinearSolverParameters::MGR::StrategyType::compositionalMultiphaseFVM;

checkDiscretizationName();

DomainPartition & domain = this->getGroupByPath< DomainPartition >( "/Problem/domain" );
NumericalMethodsManager const & numericalMethodManager = domain.getNumericalMethodManager();
FiniteVolumeManager const & fvManager = numericalMethodManager.getFiniteVolumeManager();
FluxApproximationBase const & fluxApprox = fvManager.getFluxApproximation( m_discretizationName );
GEOS_ERROR_IF( fluxApprox.upwindingParams().upwindingScheme == UpwindingScheme::HU2PH && m_numPhases != 2,
GEOS_FMT( "{}: upwinding scheme {} only supports 2-phase flow",
getName(), EnumStrings< UpwindingScheme >::toString( UpwindingScheme::HU2PH )));
}

void CompositionalMultiphaseFVM::setupDofs( DomainPartition const & domain,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
#include "constitutive/capillaryPressure/layouts.hpp"
#include "mesh/ElementRegionManager.hpp"
#include "physicsSolvers/fluidFlow/kernels/compositional/PotGrad.hpp"
#include "physicsSolvers/fluidFlow/kernels/compositional/PhaseComponentFlux.hpp"


namespace geos
Expand Down Expand Up @@ -67,7 +66,6 @@ struct C1PPUPhaseFlux
* @param dPhaseMassDens derivative of phase mass density wrt pressure, temperature, comp fraction
* @param phaseCapPressure phase capillary pressure
* @param dPhaseCapPressure_dPhaseVolFrac derivative of phase capillary pressure wrt phase volume fraction
* @param k_up uptream index for this phase
* @param potGrad potential gradient for this phase
* @param phaseFlux phase flux
* @param dPhaseFlux_dP derivative of phase flux wrt pressure
Expand All @@ -91,21 +89,15 @@ struct C1PPUPhaseFlux
ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseMob,
ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac,
ElementViewConst< arrayView3d< real64 const, compflow::USD_PHASE_DC > > const & dPhaseVolFrac,
ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_COMP > > const & phaseCompFrac,
ElementViewConst< arrayView5d< real64 const, constitutive::multifluid::USD_PHASE_COMP_DC > > const & dPhaseCompFrac,
ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens,
ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens,
ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens,
ElementViewConst< arrayView3d< real64 const, constitutive::cappres::USD_CAPPRES > > const & phaseCapPressure,
ElementViewConst< arrayView4d< real64 const, constitutive::cappres::USD_CAPPRES_DS > > const & dPhaseCapPressure_dPhaseVolFrac,
localIndex & k_up,
real64 & potGrad,
real64 ( &phaseFlux ),
real64 ( & dPhaseFlux_dP )[numFluxSupportPoints],
real64 ( & dPhaseFlux_dC )[numFluxSupportPoints][numComp],
real64 ( & compFlux )[numComp],
real64 ( & dCompFlux_dP )[numFluxSupportPoints][numComp],
real64 ( & dCompFlux_dC )[numFluxSupportPoints][numComp][numComp] )
real64 ( & dPhaseFlux_dC )[numFluxSupportPoints][numComp] )
{
real64 dPotGrad_dTrans = 0.0;
real64 dPresGrad_dP[numFluxSupportPoints]{};
Expand Down Expand Up @@ -214,13 +206,6 @@ struct C1PPUPhaseFlux
}

potGrad = potGrad * Ttrans;

// choose upstream cell for composition upwinding
k_up = (phaseFlux >= 0) ? 0 : 1;

//distribute on phaseComponentFlux here
PhaseComponentFlux::compute( ip, k_up, seri, sesri, sei, phaseCompFrac, dPhaseCompFrac, dCompFrac_dCompDens, phaseFlux
, dPhaseFlux_dP, dPhaseFlux_dC, compFlux, dCompFlux_dP, dCompFlux_dC );
}
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@
#include "physicsSolvers/fluidFlow/kernels/compositional/PPUPhaseFlux.hpp"
#include "physicsSolvers/fluidFlow/kernels/compositional/C1PPUPhaseFlux.hpp"
#include "physicsSolvers/fluidFlow/kernels/compositional/IHUPhaseFlux.hpp"
#include "physicsSolvers/fluidFlow/kernels/compositional/HU2PhaseFlux.hpp"
#include "physicsSolvers/fluidFlow/kernels/compositional/PhaseComponentFlux.hpp"

namespace geos
{
Expand Down Expand Up @@ -228,6 +230,7 @@ class FluxComputeKernel : public FluxComputeKernelBase
StackVariables & stack,
FUNC && compFluxKernelOp = NoOpFunc{} ) const
{
using namespace isothermalCompositionalMultiphaseFVMKernelUtilities;

// first, compute the transmissibilities at this face
m_stencilWrapper.computeWeights( iconn,
Expand Down Expand Up @@ -269,12 +272,11 @@ class FluxComputeKernel : public FluxComputeKernelBase
real64 phaseFlux = 0.0;
real64 dPhaseFlux_dP[numFluxSupportPoints]{};
real64 dPhaseFlux_dC[numFluxSupportPoints][numComp]{};

localIndex k_up = -1;
real64 dPhaseFlux_dTrans = 0.0; // not really used

if( m_kernelFlags.isSet( KernelFlags::C1PPU ) )
{
isothermalCompositionalMultiphaseFVMKernelUtilities::C1PPUPhaseFlux::compute< numComp, numFluxSupportPoints >
C1PPUPhaseFlux::compute< numComp, numFluxSupportPoints >
( m_numPhases,
ip,
m_kernelFlags.isSet( KernelFlags::CapPressure ),
Expand All @@ -286,22 +288,17 @@ class FluxComputeKernel : public FluxComputeKernelBase
m_gravCoef,
m_phaseMob, m_dPhaseMob,
m_phaseVolFrac, m_dPhaseVolFrac,
m_phaseCompFrac, m_dPhaseCompFrac,
m_dCompFrac_dCompDens,
m_phaseMassDens, m_dPhaseMassDens,
m_phaseCapPressure, m_dPhaseCapPressure_dPhaseVolFrac,
k_up,
potGrad,
phaseFlux,
dPhaseFlux_dP,
dPhaseFlux_dC,
compFlux,
dCompFlux_dP,
dCompFlux_dC );
dPhaseFlux_dC );
}
else if( m_kernelFlags.isSet( KernelFlags::IHU ) )
{
isothermalCompositionalMultiphaseFVMKernelUtilities::IHUPhaseFlux::compute< numComp, numFluxSupportPoints >
IHUPhaseFlux::compute< numComp, numFluxSupportPoints >
( m_numPhases,
ip,
m_kernelFlags.isSet( KernelFlags::CapPressure ),
Expand All @@ -313,22 +310,39 @@ class FluxComputeKernel : public FluxComputeKernelBase
m_gravCoef,
m_phaseMob, m_dPhaseMob,
m_phaseVolFrac, m_dPhaseVolFrac,
m_phaseCompFrac, m_dPhaseCompFrac,
m_dCompFrac_dCompDens,
m_phaseMassDens, m_dPhaseMassDens,
m_phaseCapPressure, m_dPhaseCapPressure_dPhaseVolFrac,
k_up,
potGrad,
phaseFlux,
dPhaseFlux_dP,
dPhaseFlux_dC,
compFlux,
dCompFlux_dP,
dCompFlux_dC );
dPhaseFlux_dC );
}
else if( m_kernelFlags.isSet( KernelFlags::HU2PH ) )
{
HU2PhaseFlux::compute< numComp, numFluxSupportPoints >
( m_numPhases,
ip,
m_kernelFlags.isSet( KernelFlags::CapPressure ),
m_kernelFlags.isSet( KernelFlags::CheckPhasePresenceInGravity ),
seri, sesri, sei,
trans,
dTrans_dPres,
m_pres,
m_gravCoef,
m_phaseMob, m_dPhaseMob,
m_phaseVolFrac, m_dPhaseVolFrac,
m_dCompFrac_dCompDens,
m_phaseMassDens, m_dPhaseMassDens,
m_phaseCapPressure, m_dPhaseCapPressure_dPhaseVolFrac,
potGrad,
phaseFlux,
dPhaseFlux_dP,
dPhaseFlux_dC );
}
else
{
isothermalCompositionalMultiphaseFVMKernelUtilities::PPUPhaseFlux::compute< numComp, numFluxSupportPoints >
PPUPhaseFlux::compute< numComp, numFluxSupportPoints >
( m_numPhases,
ip,
m_kernelFlags.isSet( KernelFlags::CapPressure ),
Expand All @@ -340,21 +354,25 @@ class FluxComputeKernel : public FluxComputeKernelBase
m_gravCoef,
m_phaseMob, m_dPhaseMob,
m_phaseVolFrac, m_dPhaseVolFrac,
m_phaseCompFrac, m_dPhaseCompFrac,
m_dCompFrac_dCompDens,
m_phaseMassDens, m_dPhaseMassDens,
m_phaseCapPressure, m_dPhaseCapPressure_dPhaseVolFrac,
k_up,
potGrad,
phaseFlux,
dPhaseFlux_dP,
dPhaseFlux_dC,
compFlux,
dCompFlux_dP,
dCompFlux_dC,
dCompFlux_dTrans );
dPhaseFlux_dTrans );
}

// choose upstream cell for composition upwinding
localIndex const k_up = (phaseFlux >= 0) ? 0 : 1;

// distribute on phaseComponentFlux here
PhaseComponentFlux::compute( ip, k_up, seri, sesri, sei,
m_phaseCompFrac, m_dPhaseCompFrac, m_dCompFrac_dCompDens,
phaseFlux, dPhaseFlux_dP, dPhaseFlux_dC, dPhaseFlux_dTrans,
compFlux, dCompFlux_dP, dCompFlux_dC, dCompFlux_dTrans );

// call the lambda in the phase loop to allow the reuse of the phase fluxes and their derivatives
// possible use: assemble the derivatives wrt temperature, and the flux term of the energy equation for this phase
compFluxKernelOp( ip, m_kernelFlags.isSet( KernelFlags::CheckPhasePresenceInGravity ),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,9 @@ enum class KernelFlags
/// Flag indicating whether C1-PPU is used or not
C1PPU = 1 << 5, // 32
/// Flag indicating whether IHU is used or not
IHU = 1 << 6 // 64
/// Add more flags like that if needed:
// Flag8 = 1 << 7 //128
IHU = 1 << 6, // 64
/// Flag indicating whether HU 2-phase simplified version is used or not
HU2PH = 1 << 7 // 128
};

/******************************** FluxComputeKernelBase ********************************/
Expand Down Expand Up @@ -176,6 +176,81 @@ class FluxComputeKernelBase
BitFlags< KernelFlags > const m_kernelFlags;
};

namespace helpers
{
template< typename VIEWTYPE >
using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >;

template< localIndex numComp, localIndex numFluxSupportPoints >
GEOS_HOST_DEVICE
static void calculateMeanDensity( localIndex const ip,
localIndex const (&seri)[numFluxSupportPoints],
localIndex const (&sesri)[numFluxSupportPoints],
localIndex const (&sei)[numFluxSupportPoints],
integer const checkPhasePresenceInGravity,
ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const & phaseVolFrac,
ElementViewConst< arrayView3d< real64 const, compflow::USD_COMP_DC > > const & dCompFrac_dCompDens,
ElementViewConst< arrayView3d< real64 const, constitutive::multifluid::USD_PHASE > > const & phaseMassDens,
ElementViewConst< arrayView4d< real64 const, constitutive::multifluid::USD_PHASE_DC > > const & dPhaseMassDens,
real64 & densMean, real64 (& dDensMean_dPres)[numFluxSupportPoints], real64 (& dDensMean_dComp)[numFluxSupportPoints][numComp] )
{
using Deriv = constitutive::multifluid::DerivativeOffset;

densMean = 0;
integer denom = 0;
real64 dDens_dC[numComp]{};
for( localIndex i = 0; i < numFluxSupportPoints; ++i )
{
localIndex const er = seri[i];
localIndex const esr = sesri[i];
localIndex const ei = sei[i];

bool const phaseExists = (phaseVolFrac[er][esr][ei][ip] > 0);
if( checkPhasePresenceInGravity && !phaseExists )
{
dDensMean_dPres[i] = 0.0;
for( localIndex jc = 0; jc < numComp; ++jc )
{
dDensMean_dComp[i][jc] = 0.0;
}
continue;
}

// density
real64 const density = phaseMassDens[er][esr][ei][0][ip];
real64 const dDens_dPres = dPhaseMassDens[er][esr][ei][0][ip][Deriv::dP];

applyChainRule( numComp,
dCompFrac_dCompDens[er][esr][ei],
dPhaseMassDens[er][esr][ei][0][ip],
dDens_dC,
Deriv::dC );

// average density and derivatives
densMean += density;
dDensMean_dPres[i] = dDens_dPres;
for( localIndex jc = 0; jc < numComp; ++jc )
{
dDensMean_dComp[i][jc] = dDens_dC[jc];
}
denom++;
}
if( denom > 1 )
{
densMean /= denom;
for( localIndex i = 0; i < numFluxSupportPoints; ++i )
{
dDensMean_dPres[i] /= denom;
for( integer jc = 0; jc < numComp; ++jc )
{
dDensMean_dComp[i][jc] /= denom;
}
}
}
}

}

} // namespace isothermalCompositionalMultiphaseFVMKernels

} // namespace geos
Expand Down
Loading
Loading