20 #ifndef GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_PPUPHASEFLUX_HPP
21 #define GEOS_PHYSICSSOLVERS_FLUIDFLOW_COMPOSITIONAL_PPUPHASEFLUX_HPP
25 #include "constitutive/fluid/multifluid/Layouts.hpp"
26 #include "constitutive/capillaryPressure/layouts.hpp"
34 namespace isothermalCompositionalMultiphaseFVMKernelUtilities
37 template<
typename VIEWTYPE >
38 using ElementViewConst = ElementRegionManager::ElementViewConst< VIEWTYPE >;
40 using Deriv = constitutive::multifluid::DerivativeOffset;
76 template<
integer numComp,
integer numFluxSupportPo
ints >
82 integer const checkPhasePresenceInGravity,
83 localIndex const ( &seri )[numFluxSupportPoints],
84 localIndex const ( &sesri )[numFluxSupportPoints],
85 localIndex const ( &sei )[numFluxSupportPoints],
86 real64 const ( &trans )[2],
87 real64 const ( &dTrans_dPres )[2],
104 real64 ( & dPhaseFlux_dP )[numFluxSupportPoints],
105 real64 ( & dPhaseFlux_dC )[numFluxSupportPoints][numComp],
106 real64 ( & compFlux )[numComp],
107 real64 ( & dCompFlux_dP )[numFluxSupportPoints][numComp],
108 real64 ( & dCompFlux_dC )[numFluxSupportPoints][numComp][numComp],
109 real64 ( & dCompFlux_dTrans )[numComp] )
111 real64 dPotGrad_dTrans = 0;
112 real64 dPresGrad_dP[numFluxSupportPoints]{};
113 real64 dPresGrad_dC[numFluxSupportPoints][numComp]{};
114 real64 dGravHead_dP[numFluxSupportPoints]{};
115 real64 dGravHead_dC[numFluxSupportPoints][numComp]{};
116 PotGrad::compute< numComp, numFluxSupportPoints >( numPhase, ip, hasCapPressure, checkPhasePresenceInGravity,
117 seri, sesri, sei, trans, dTrans_dPres, pres,
118 gravCoef, phaseVolFrac, dPhaseVolFrac, dCompFrac_dCompDens,
119 phaseMassDens, dPhaseMassDens,
120 phaseCapPressure, dPhaseCapPressure_dPhaseVolFrac,
121 potGrad, dPotGrad_dTrans, dPresGrad_dP,
122 dPresGrad_dC, dGravHead_dP, dGravHead_dC );
127 k_up = (potGrad >= 0) ? 0 : 1;
133 real64 const mobility = phaseMob[er_up][esr_up][ei_up][ip];
136 phaseFlux = mobility * potGrad;
138 real64 const dPhaseFlux_dTrans = mobility * dPotGrad_dTrans;
141 for(
integer ke = 0; ke < numFluxSupportPoints; ++ke )
143 dPhaseFlux_dP[ke] += dPresGrad_dP[ke] - dGravHead_dP[ke];
144 dPhaseFlux_dP[ke] *= mobility;
145 for(
integer jc = 0; jc < numComp; ++jc )
147 dPhaseFlux_dC[ke][jc] += dPresGrad_dC[ke][jc] - dGravHead_dC[ke][jc];
148 dPhaseFlux_dC[ke][jc] *= mobility;
152 real64 const dMob_dP = dPhaseMob[er_up][esr_up][ei_up][ip][Deriv::dP];
154 dPhaseMob[er_up][esr_up][ei_up][ip];
157 dPhaseFlux_dP[k_up] += dMob_dP * potGrad;
158 for(
integer jc = 0; jc < numComp; ++jc )
160 dPhaseFlux_dC[k_up][jc] += dPhaseMobSub[Deriv::dC+jc] * potGrad;
165 phaseFlux, dPhaseFlux_dP, dPhaseFlux_dC, dPhaseFlux_dTrans, compFlux, dCompFlux_dP, dCompFlux_dC, dCompFlux_dTrans );
#define GEOS_HOST_DEVICE
Marks a host-device function.
ArrayView< T, 1 > arrayView1d
Alias for 1D array view.
ArrayView< T, 5, USD > arrayView5d
Alias for 5D array view.
double real64
64-bit floating point type.
GEOS_LOCALINDEX_TYPE localIndex
Local index type (for indexing objects within an MPI partition).
ArraySlice< T, 1, USD > arraySlice1d
Alias for 1D array slice.
std::int32_t integer
Signed integer type.
ArrayView< T, 4, USD > arrayView4d
Alias for 4D array view.
ArrayView< T, 2, USD > arrayView2d
Alias for 2D array view.
ArrayView< T, 3, USD > arrayView3d
Alias for 3D array view.
static GEOS_HOST_DEVICE void compute(integer const numPhase, integer const ip, integer const hasCapPressure, integer const checkPhasePresenceInGravity, localIndex const (&seri)[numFluxSupportPoints], localIndex const (&sesri)[numFluxSupportPoints], localIndex const (&sei)[numFluxSupportPoints], real64 const (&trans)[2], real64 const (&dTrans_dPres)[2], ElementViewConst< arrayView1d< real64 const > > const &pres, ElementViewConst< arrayView1d< real64 const > > const &gravCoef, ElementViewConst< arrayView2d< real64 const, compflow::USD_PHASE > > const &phaseMob, 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(&dCompFlux_dTrans)[numComp])
Form the PhasePotentialUpwind from pressure gradient and gravitational head.
static GEOS_HOST_DEVICE void compute(localIndex const ip, localIndex const k_up, localIndex const (&seri)[numFluxSupportPoints], localIndex const (&sesri)[numFluxSupportPoints], localIndex const (&sei)[numFluxSupportPoints], 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, real64 const &phaseFlux, real64 const (&dPhaseFlux_dP)[numFluxSupportPoints], real64 const (&dPhaseFlux_dC)[numFluxSupportPoints][numComp], real64(&compFlux)[numComp], real64(&dCompFlux_dP)[numFluxSupportPoints][numComp], real64(&dCompFlux_dC)[numFluxSupportPoints][numComp][numComp])
Compute the component flux for a given phase.