diff --git a/.integrated_tests.yaml b/.integrated_tests.yaml index dd29b8f9e71..62bc6f8ccb2 100644 --- a/.integrated_tests.yaml +++ b/.integrated_tests.yaml @@ -1,6 +1,6 @@ baselines: bucket: geosx - baseline: integratedTests/baseline_integratedTests-pr4139-17884-0f6d03e + baseline: integratedTests/baseline_integratedTests-pr4172-17930-ffdaf0c allow_fail: all: '' streak: '' diff --git a/BASELINE_NOTES.md b/BASELINE_NOTES.md index 90caa852c88..007bcee14ac 100644 --- a/BASELINE_NOTES.md +++ b/BASELINE_NOTES.md @@ -5,6 +5,10 @@ This file is designed to track changes to the integrated test baselines. Any developer who updates the baseline ID in the .integrated_tests.yaml file is expected to create an entry in this file with the pull request number, date, and their justification for rebaselining. These notes should be in reverse-chronological order, and use the following time format: (YYYY-MM-DD). +PR #4172 (2026-11-06) +===================== +Correct CO2-brine thermodynamic properties: CO2 enthalpy tables (Span–Wagner non-analytic terms, molar conversion), CO2 solubility on a brine basis, compositional phase-model mapping and flash restart. + PR #4139 (2026-10-31) ===================== Add the mixed mimetic discretization: new `NumericalMethods/MixedMimetic` group in every restart file and new mixed MFD tests. diff --git a/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell.ats b/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell.ats index e473d997e2f..24a0f634a21 100644 --- a/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell.ats +++ b/inputFiles/compositionalMultiphaseFlow/benchmarks/thermalLeakyWell/thermalLeakyWell.ats @@ -10,7 +10,7 @@ decks = [ description= "Smoke test for thermalLeakyWell (3D displacement, 2-phase co2-brine, hydrostatic initial condition)", partitions=((1, 1, 1), (2, 2, 1)), - restart_step=60, + restart_step=50, check_step=104, restartcheck_params=RestartcheckParameters(**restartcheck_params)), ] diff --git a/inputFiles/constitutiveDriver/constitutiveDriver.ats b/inputFiles/constitutiveDriver/constitutiveDriver.ats index 7c86d2bb31b..f6e464819f3 100644 --- a/inputFiles/constitutiveDriver/constitutiveDriver.ats +++ b/inputFiles/constitutiveDriver/constitutiveDriver.ats @@ -37,6 +37,7 @@ decks = [ create_pvt_test("testPVT_CO2Brine", "PVT Driver test for CO2 fluid models"), create_pvt_test("testPVT_CO2BrineTables", "PVT Driver test for CO2 fluid models with solubility tables"), create_pvt_test("testPVT_PhaseComposition", "PVT Driver test with composition output"), + create_pvt_test("testPVT_Compositional", "PVT Driver test for compositional models"), create_pvt_test("testPVT_ThreePhaseCompositional", "PVT Driver test for three phase compositional models"), create_pvt_test("testPVT_docExample", "PVT Driver documentation example"), create_relperm_test("testRelperm_Table_2_phase", "Relperm driver for 2 phase tables"), diff --git a/inputFiles/constitutiveDriver/testPVT_Compositional.xml b/inputFiles/constitutiveDriver/testPVT_Compositional.xml new file mode 100644 index 00000000000..4e4ff80d3d0 --- /dev/null +++ b/inputFiles/constitutiveDriver/testPVT_Compositional.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/coreComponents/constitutive/docs/CO2BrineFluid.rst b/src/coreComponents/constitutive/docs/CO2BrineFluid.rst index e3db579a621..5f9161d033d 100644 --- a/src/coreComponents/constitutive/docs/CO2BrineFluid.rst +++ b/src/coreComponents/constitutive/docs/CO2BrineFluid.rst @@ -8,10 +8,16 @@ CO2-brine model Summary ======= -The CO2-brine model implemented in GEOS includes two components (CO2 and H2O) that are transported by one or two fluid phases (the brine phase and the CO2 phase). +The CO2-brine model implemented in GEOS has two transported components, CO2 and a component named ``water``, distributed between the brine phase and the CO2-rich phase. + +In the liquid phase, ``water`` represents the brine, including its dissolved salt, rather than H2O alone. Liquid component mass fractions therefore partition the total liquid mass between dissolved CO2 and brine. Salinity is prescribed as a constant parameter; NaCl is not a separately transported component. + +The ``componentMolarWeight`` assigned to ``water`` (usually 0.018 kg/mol) defines the conversion between this component's mass and its pseudo-molar amount. It is not a physical molecular weight of brine. Consequently, liquid component mole fractions are pseudo-mole fractions, not molecular mole fractions of CO2, H2O and NaCl. + +When water vaporization is enabled, the same transported component represents vaporized H2O in the CO2-rich phase. This is a two-component, fixed-salinity approximation: the model does not separately conserve H2O and NaCl or predict salinity changes caused by evaporation. We refer to the brine phase with the subscript :math:`\ell` and to the CO2 phase with the subscript :math:`g` (although the CO2 phase can be in a supercritical, liquid, or gas state). Both the water component and the CO2 component can be present in the CO2 phase as well as in the brine phase depending on the solubility model selected. -Thus, considering the molar phase component fractions, :math:`y_{c,p}` (i.e., the fraction of the molar mass of phase :math:`p` represented by component :math:`c`) the following partition matrix determines the component distribution within the two phases: +Thus, considering the molar phase component fractions, :math:`y_{c,p}` (i.e., the fraction of the total pseudo-molar amount of phase :math:`p` represented by component :math:`c`) the following partition matrix determines the component distribution within the two phases: .. math:: \begin{bmatrix} @@ -39,7 +45,13 @@ The models that are used in steps 1) and 2) are reviewed in more details below. Step 1: Computation of the phase fractions and phase component fractions (flash) ================================================================================ -At initialization, GEOS performs a preprocessing step to construct a two-dimensional table storing the values of CO2 solubility in brine and water solubility in the gas phase as functions of pressure, temperature, and a constant salinity. Solubility is calculated and provided as moles of the component dissolved or vaporized per mass of the phase. For CO2 this will be moles of CO2 dissolved per kg of water and for water this will be moles of H2O vaporized in the CO2 phase per kg of CO2. +At initialization, GEOS performs a preprocessing step to construct a two-dimensional table storing the values of CO2 solubility in brine and water solubility in the gas phase as functions of pressure, temperature, and a constant salinity. Solubility is stored as moles of the component dissolved or vaporized per kg of the other component. The ``water`` component of these fluids is the brine, salt included: its density is the brine density, so one kg of it holds :math:`1/(1 + m M_{NaCl})` kg of H2O, where :math:`m` is the NaCl molality (mol per kg of H2O) and :math:`M_{NaCl}` the molar weight of NaCl. The solubility models return the equilibrium loading :math:`b_{CO2}` in moles of CO2 per kg of H2O; GEOS divides it by :math:`1 + m M_{NaCl}` so that the stored CO2 solubility is in moles of CO2 per kg of the water (brine) component. For a saturated liquid in two-phase equilibrium, the liquid pseudo-mole fraction :math:`y_{CO2,\ell}` produced by the flash therefore satisfies + +.. math:: + + \frac{y_{CO2,\ell}}{M_w (1 - y_{CO2,\ell})} = \frac{b_{CO2}}{1 + m M_{NaCl}}, + +where :math:`M_w` is the ``componentMolarWeight`` of the ``water`` component. An undersaturated single-phase liquid inherits the overall composition instead, and its CO2 content per kg of brine is :math:`y_{CO2,\ell}/[M_w(1-y_{CO2,\ell})]` as for any liquid composition. The water solubility is in moles of H2O per kg of CO2. There are 3 alternatives to providing solubility data for the phase partition calculation. @@ -63,13 +75,13 @@ To conclude this preprocessing step, we use the fugacity coefficient of CO2 to c .. math:: \ln \frac{ y_{CO2} P }{ s_{CO2} } = \frac{\Phi_{CO2}}{RT} - \ln_{\phi}(p,T) + \sum_c 2 \lambda_c m + \sum_a 2 \lambda_a m + \sum_{a,c} \zeta_{a,c} m^2 -where :math:`\Phi_{CO2}` is the chemical potential of the CO2 component, :math:`R` is the gas constant, and :math:`m` is the salinity. +where :math:`\Phi_{CO2}` is the chemical potential of the CO2 component, :math:`R` is the gas constant, and :math:`m` is the NaCl molality. The solubility :math:`s_{CO2}` is in moles of CO2 per kg of H2O and is converted to the brine basis of the water component as described above. The mole fraction of CO2 in the vapor phase, :math:`y_{CO2}`, is computed with equation (4) of Duan and Sun (2003). Note that the first, third, fourth, and fifth terms in the equation written above are approximated using equation (7) of Duan and Sun (2003) as recommended by the authors. Spycher and Pruess (2005) model ------------------------------- -The partitioning behavior of CO2 between aqueous and gas phases in chloride brines is computed using the model developed by Spycher and Pruess (2005), which builds upon earlier work by Spycher et al. (2003). This model accounts for both the solubility of CO2 in brine and the vaporization of H2O into the gas phase, offering a comprehensive thermodynamic treatment. +The partitioning of CO2 between the aqueous and gas phases is computed with the procedure of Spycher et al. (2003), which accounts for both the solubility of CO2 in water and the vaporization of H2O into the gas phase. The salting-out correction of Spycher and Pruess (2005) for chloride brines is not applied in the current implementation: the solubility is that of pure water whatever the value of ``salinity``, and only the basis conversion described above depends on it. The calculation begins with the determination of equilibrium constants :math:`k_{CO2}` and :math:`k_{H2O}` at a reference pressure :math:`P_0 = 1 \, \text{bar}`. These constants are expressed as temperature-dependent correlations: @@ -131,7 +143,7 @@ Tabulated solubilities ---------------------- Alternatively, the user may provide solubility tables generated externally to GEOS. These must be supplied as two‑dimensional lookup tables (TableFunction) with pressure and temperature as the coordinate axes. A CO2 solubility table is required, while the water vaporization table is optional. If a water vaporization table is not provided, water vaporization is neglected (i.e., zero vaporization is assumed). -For all tables, pressure must be specified in pascals (Pa), temperature in kelvin (K), and solubility as moles of solute per unit mass of solvent (mol/kg). +For all tables, pressure must be specified in pascals (Pa), temperature in kelvin (K), and solubility as moles of solute per kg of solvent (mol/kg): moles of CO2 per kg of H2O for the CO2 table, moles of H2O per kg of CO2 for the water table. The CO2 table is converted by GEOS to the brine basis of the water component (division by :math:`1 + m M_{NaCl}`, into a derived table named after the fluid), as for the analytic models. Tables that were prepared on a per-kg-of-brine basis for a saline case must therefore be multiplied by :math:`1 + m M_{NaCl}` before being given to GEOS. Flash calculation ----------------- @@ -307,14 +319,15 @@ Then, in a second step, the density is modified using the method of Garcia (2001 \rho_{\ell} = \rho_{\ell,table} + M_{CO2} c_{CO2} - c_{CO2} \rho_{\ell,table} V_{\phi} -where :math:`M_{CO2}` is the molecular weight of CO2, :math:`c_{CO2}` is the concentration of CO2 in brine, and :math:`V_{\phi}` is the apparent molar volume of dissolved CO2. -The CO2 concentration in brine is obtained as: +where :math:`M_{CO2}` is the molecular weight of CO2, :math:`c_{CO2}` is the concentration of CO2 per unit volume of gas-free brine, and :math:`V_{\phi}` is the apparent molar volume of dissolved CO2. +The CO2 concentration per unit volume of gas-free brine is .. math:: - c_{CO2} = \frac{y_{CO2,\ell} \rho_{\ell,table}}{M_{H2O}(1-y_{CO2,\ell})} + c_{CO2} = \frac{y_{CO2,\ell} \rho_{\ell,table}}{M_w (1-y_{CO2,\ell})} + +where :math:`M_w` is the configured ``componentMolarWeight`` of the ``water`` component and :math:`y_{CO2,\ell}` is the liquid CO2 pseudo-mole fraction. Thus :math:`y_{CO2,\ell}/[M_w(1-y_{CO2,\ell})]` is in moles of CO2 per kg of brine, not per kg of H2O, and no additional salinity conversion is applied in the density kernel. The expression for :math:`\rho_{\ell}` is the first-order form of Garcia's mixing rule; its deviation from the exact rule grows with the dissolved CO2 content and depends on the brine density and on :math:`V_{\phi}` (a few percent of the CO2 density increment for the CO2 mass fractions reached at reservoir conditions). -where :math:`M_{H2O}` is the molecular weight of water. The apparent molar volume of dissolved CO2 is computed as a function of temperature using the expression: .. math:: @@ -334,7 +347,7 @@ where the coefficients :math:`a` and :math:`b` are defined as: b &= \mu_{w}(T) (1.0 + 0.0816 m + 0.0122 m^2 + 0.000128 m^3) where :math:`\mu_{w}` is the pure water viscosity computed as a function of temperature, -and :math:`m` is the user-defined salinity (in moles of NaCl per kg of brine). +and :math:`m` is the user-defined salinity, the NaCl molality (moles of NaCl per kg of H2O). Brine density and viscosity using Ezrokhi correlation @@ -394,7 +407,7 @@ To account for the presence of dissolved non-condensible gases such as carbon di H_{\text{phase}} = (1 - C) H_{\text{CO}_2} + C H_{\text{brine}} -where :math:`C` is the composition fraction of the brine component. Depending on the solver configuration, this combination is performed either on a mass basis or a molar basis. If a molar basis is used, the constituent enthalpies are internally scaled by the inverse molecular weights of their respective components prior to averaging. +where :math:`C` is the composition fraction of the water (brine) component. Depending on the solver configuration, this combination is performed either on a mass basis (specific enthalpies, J/kg, weighted by mass fractions) or a molar basis (the specific enthalpies multiplied by the molar weights of their respective components, J/mol, weighted by mole fractions). Parameters ========================= @@ -423,7 +436,7 @@ co2,CO2 CO2 component water,liquid Water component ============= =============== -The salinity is specified in moles per kg of brine using the ``salinity`` attribute. +The salinity is specified as the NaCl molality, in moles of NaCl per kg of H2O, using the ``salinity`` attribute. This is the salinity variable of the Phillips et al. (1981) and Duan and Sun (2003) correlations. The solubility model is selected using the ``solubilityModel`` attribute. If the solubility is set to ``Tables`` then user defined tables should be provided using the ``solubilityTableNames`` attribute. If a single table is provided, this will be treated as the CO2 solubility table while water vaporization will be zero. It 2 tables are provided, then the second table will be treated as the water vaporization table. Both values must give the names of ```` xml elements which define lookup tables for functions of pressure and temperature. @@ -497,7 +510,7 @@ Example temperatureCoordinates="{283.15, 393.5}" temperatureInterval="5" salinity="1.901285269" - ezrokhiDensityCoefficients="{0.1033, -2.2991e-5, -2.3658e-6}" + ezrokhiDensityCoefficients="{0.1003, -2.2991e-5, -2.3658e-6}" ezrokhiViscosityCoefficients="{0, 0, 0}" /> diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp index 9d8623c3259..a66fbed0946 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/CO2BrineFluid.hpp @@ -446,7 +446,7 @@ CO2BrineFluid< PHASE1, PHASE2, FLASH >::KernelWrapper:: computeInternalEnergy( pressure, phaseFraction, - phaseMassDensity, + m_useMass ? phaseMassDensity : phaseDensity, phaseEnthalpy, phaseInternalEnergy ); } diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.hpp index a71874d2561..f659bd101c9 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/BrineEnthalpy.hpp @@ -174,18 +174,18 @@ void BrineEnthalpyUpdate::compute( real64 const & pressure, } else { - real64 const waterMWInv = 1.0 / m_componentMolarWeight[m_waterIndex]; - real64 const CO2MWInv = 1.0 / m_componentMolarWeight[m_CO2Index]; + real64 const waterMW = m_componentMolarWeight[m_waterIndex]; + real64 const CO2MW = m_componentMolarWeight[m_CO2Index]; - value = (1.0 - C ) * CO2Enthalpy * CO2MWInv + C * brineEnthalpy * waterMWInv; + value = (1.0 - C ) * CO2Enthalpy * CO2MW + C * brineEnthalpy * waterMW; - dvalue_dC = brineEnthalpy * waterMWInv - CO2Enthalpy * CO2MWInv; - dValue[Deriv::dP] = (1.0 - C ) * CO2EnthalpyDeriv[0] * CO2MWInv + dvalue_dC = brineEnthalpy * waterMW - CO2Enthalpy * CO2MW; + dValue[Deriv::dP] = (1.0 - C ) * CO2EnthalpyDeriv[0] * CO2MW + dvalue_dC * dPhaseComposition[m_waterIndex][Deriv::dP]; dValue[Deriv::dT] = LvArray::math::max( 0.0, - (1.0 - C ) * CO2EnthalpyDeriv[1] * CO2MWInv - + C * brineEnthalpy_dTemperature * waterMWInv + (1.0 - C ) * CO2EnthalpyDeriv[1] * CO2MW + + C * brineEnthalpy_dTemperature * waterMW + dvalue_dC * dPhaseComposition[m_waterIndex][Deriv::dT] ); } diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.cpp index e609578e852..213ba649530 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.cpp @@ -180,13 +180,15 @@ real64 helmholtzCO2Enthalpy( real64 const & T, } + // exponents a_i of Span & Wagner (1996) Table 31 for the non-analytic terms + static const real64 aExp[3] = {3.5, 3.5, 3.0}; for( localIndex i=39; i<42; i++ ) { theta = (1.0 - rt) + Ai[i] * pow( pow( rd - 1.0, 2.0 ), (1.0 / (2.0 * betai[i]))); - delta = pow( theta, 2.0 ) + Bi[i] * pow( rd - 1.0, 2.0*alphai[i] ); + delta = pow( theta, 2.0 ) + Bi[i] * pow( pow( rd - 1.0, 2.0 ), aExp[i-39] ); R = exp( -Ci[i] * pow( rd - 1.0, 2.0 ) - Di[i] * pow( rt - 1.0, 2.0 )); - deltard = (rd - 1.0) * (Ai[i] * theta * 2.0 / betai[i] * pow( pow( rd - 1.0, 2.0 ), 0.5 / betai[i] - 1.0 ) + 2.0 * Bi[i] * alphai[i] * pow( pow( rd - 1.0, 2.0 ), alphai[i] - 1.0 )); + deltard = (rd - 1.0) * (Ai[i] * theta * 2.0 / betai[i] * pow( pow( rd - 1.0, 2.0 ), 0.5 / betai[i] - 1.0 ) + 2.0 * Bi[i] * aExp[i-39] * pow( pow( rd - 1.0, 2.0 ), aExp[i-39] - 1.0 )); phird += ni[i] * (pow( delta, bi[i] ) * (R + rd *(-2.0 *Ci[i] * (rd - 1.0) * R)) + bi[i] * pow( delta, bi[i] - 1.0 ) * deltard * rd * R); diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.hpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.hpp index 453d1e26571..14522bbb293 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Enthalpy.hpp @@ -144,10 +144,10 @@ void CO2EnthalpyUpdate::compute( real64 const & pressure, if( !useMass ) { - real64 const CO2MWInv = 1.0 / m_componentMolarWeight[m_CO2Index]; - value *= CO2MWInv; - dValue[Deriv::dP] *= CO2MWInv; - dValue[Deriv::dT] *= CO2MWInv; + real64 const CO2MW = m_componentMolarWeight[m_CO2Index]; + value *= CO2MW; + dValue[Deriv::dP] *= CO2MW; + dValue[Deriv::dT] *= CO2MW; } } diff --git a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp index d2cc5d802a0..298d6fbf28d 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/CO2Brine/functions/CO2Solubility.cpp @@ -64,6 +64,11 @@ makeSolubilityTables( string const & functionName, auto const & solubilityModel = brineFluidParameters.m_solubilityModel; + // The solubility models and user tables give mol CO2 per kg H2O, but the "water" component of the + // CO2-brine fluids is the brine (H2O + NaCl): the solubility is converted to mol CO2 per kg of brine + real64 constexpr saltMolarWeight = 58.44e-3; + real64 const solventPerWater = 1.0 + brineFluidParameters.m_salinity * saltMolarWeight; + // Check solubility model for explicit table input if( solubilityModel == constitutive::PVTProps::BrineFluidParameters::SolubilityModel::Tables ) { @@ -91,6 +96,36 @@ makeSolubilityTables( string const & functionName, GEOS_THROW_IF( !functionManager.hasGroup< TableFunction >( inputTableName ), GEOS_FMT( "{}: Could not find TableFunction with name {}", functionName, inputTableName ), InputError ); + if( tableIndex == 0 && brineFluidParameters.m_salinity > 0.0 ) + { + // convert the user CO2 table into a derived table (the user's table may serve fluids of other salinity) + functionManager.getGroup< TableFunction >( inputTableName ).initializeFunction(); + TableFunction const & userTable = functionManager.getGroup< TableFunction >( inputTableName ); + string const convertedName = GEOS_FMT( "{}_{}_brineBasis", functionName, inputTableName ); + if( !functionManager.hasGroup< TableFunction >( convertedName ) ) + { + ArrayOfArraysView< real64 const > const userCoords = userTable.getCoordinates(); + array1d< real64_array > coords( userCoords.size() ); + for( localIndex d = 0; d < userCoords.size(); ++d ) + { + coords[d].resize( userCoords.sizeOfArray( d ) ); + for( localIndex k = 0; k < userCoords.sizeOfArray( d ); ++k ) + { + coords[d][k] = userCoords[d][k]; + } + } + real64_array convertedValues( userTable.getValues().size() ); + for( localIndex k = 0; k < convertedValues.size(); ++k ) + { + convertedValues[k] = userTable.getValues()[k] / solventPerWater; + } + TableFunction * converted = dynamicCast< TableFunction * >( functionManager.createChild( "TableFunction", convertedName ) ); + converted->setTableCoordinates( coords, { userTable.getDimUnit( 0 ), userTable.getDimUnit( 1 ) } ); + converted->setTableValues( convertedValues, units::Solubility ); + converted->setInterpolationMethod( userTable.getInterpolationMethod() ); + } + inputTableName = convertedName; + } } tables[tableIndex] = makeTable( inputTableName, tableCoords, std::move ( values ), functionManager ); } @@ -141,6 +176,12 @@ makeSolubilityTables( string const & functionName, h2oSolubility ); } + // convert the model's mol CO2 per kg H2O to mol CO2 per kg of the water (brine) component + for( localIndex k = 0; k < co2Solubility.size(); ++k ) + { + co2Solubility[k] /= solventPerWater; + } + // Truncate negative solubility and warn integer constexpr maxBad = 5; // Maximum number of bad values to report stackArray2d< real64, maxBad *4 > badValues( maxBad, 4 ); diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp index d8ab70a4a8f..5eb4f38ffa6 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/CompositionalMultiphaseFluid.cpp @@ -275,7 +275,7 @@ void CompositionalMultiphaseFluid< FLASH, PHASES... >::createPhaseModels( std::i ((camp::get< Is >( m_phases ) = std::make_unique< PHASES >( GEOS_FMT( "{}_PhaseModel{}", getName(), Is + 1 ), *m_componentProperties, - Is, + m_phaseOrder[Is], // the phase this model is applied to, not the model position *m_parameters )), ...); } diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash_impl.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash_impl.hpp index f251d632117..86384ca9c1c 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash_impl.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/functions/NegativeTwoPhaseFlash_impl.hpp @@ -79,7 +79,9 @@ bool NegativeTwoPhaseFlash::compute( integer const numComps, vapourPhaseMoleFraction = RachfordRice::solve( kVapourLiquid.toSliceConst(), composition, presentComponents ); // Assign phase compositions - for( integer ic = 0; ic < numComps; ++ic ) + // Absent components are excluded from the Rachford-Rice solve and their k-values are never updated, + // so a negative vapour fraction can sit on their pole 1/(1-K): leave them at their initial feed value + for( integer const ic : presentComponents ) { liquidComposition[ic] = composition[ic] / ( 1.0 + vapourPhaseMoleFraction * ( kVapourLiquid[ic] - 1.0 ) ); vapourComposition[ic] = kVapourLiquid[ic] * liquidComposition[ic]; diff --git a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp index 9370e92a70c..6697298e2fa 100644 --- a/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp +++ b/src/coreComponents/constitutive/fluid/multifluid/compositional/models/NegativeTwoPhaseFlashModel.hpp @@ -92,25 +92,7 @@ class NegativeTwoPhaseFlashModelUpdate final : public FunctionBaseUpdate bool const needInitialisation = (pureComponent < 0) && hasZero( m_numComponents, kVapourLiquid.toSliceConst() ); if( needInitialisation ) { - if( m_flashData.liquidEos == EquationOfStateType::SoreideWhitson ) - { - // Initialise the trial compositions using SW uniform values - KValueInitialization::computeSoreideWhitsonKvalue( m_numComponents, - pressure, - temperature, - componentProperties, - compFraction, - kVapourLiquid ); - } - else - { - // Initialise the trial compositions using Wilson k-Values - KValueInitialization::computeWilsonGasLiquidKvalue( m_numComponents, - pressure, - temperature, - componentProperties, - kVapourLiquid ); - } + initialiseKValues( componentProperties, pressure, temperature, compFraction, kVapourLiquid ); } integer const stabilityIterations = m_discreteFlashParameters[FlashParameters::STABILITY_MAX_ITERATIONS]; @@ -153,18 +135,68 @@ class NegativeTwoPhaseFlashModelUpdate final : public FunctionBaseUpdate { // Unstable mixture // Iterative solve to converge flash - bool const flashStatus = NegativeTwoPhaseFlash::compute( m_numComponents, - pressure, - temperature, - compFraction, - componentProperties, - m_flashData, - m_continuousFlashParameters.toSliceConst(), - m_discreteFlashParameters.toSliceConst(), - kValues, - phaseFraction.value[m_vapourIndex], - phaseCompFraction.value[m_liquidIndex], - phaseCompFraction.value[m_vapourIndex] ); + bool flashStatus = NegativeTwoPhaseFlash::compute( m_numComponents, + pressure, + temperature, + compFraction, + componentProperties, + m_flashData, + m_continuousFlashParameters.toSliceConst(), + m_discreteFlashParameters.toSliceConst(), + kValues, + phaseFraction.value[m_vapourIndex], + phaseCompFraction.value[m_liquidIndex], + phaseCompFraction.value[m_vapourIndex] ); + + // The stability test found the mixture unstable but the flash collapsed to the trivial + // solution: restart from the incipient phase found by the stability test + real64 maxLogK = 0.0; + for( integer ic = 0; ic < m_numComponents; ++ic ) + { + maxLogK = LvArray::math::max( maxLogK, LvArray::math::abs( LvArray::math::log( kVapourLiquid[ic] ) ) ); + } + if( unstableMixture && maxLogK < 1.0e-4 ) + { + bool const incipientIsVapour = calculateLiTemperature( componentProperties, incipientComposition.toSliceConst() ) < + calculateLiTemperature( componentProperties, compFraction ); + for( integer ic = 0; ic < m_numComponents; ++ic ) + { + real64 const zi = LvArray::math::max( compFraction[ic], MultiFluidConstants::minForSpeciesPresence ); + real64 const yi = LvArray::math::max( incipientComposition[ic], MultiFluidConstants::minForSpeciesPresence ); + kVapourLiquid[ic] = incipientIsVapour ? yi / zi : zi / yi; + } + flashStatus = NegativeTwoPhaseFlash::compute( m_numComponents, + pressure, + temperature, + compFraction, + componentProperties, + m_flashData, + m_continuousFlashParameters.toSliceConst(), + m_discreteFlashParameters.toSliceConst(), + kValues, + phaseFraction.value[m_vapourIndex], + phaseCompFraction.value[m_liquidIndex], + phaseCompFraction.value[m_vapourIndex] ); + } + + // The stored k-values carry the history of the cell and can be a poor starting point for the + // current state: restart from freshly initialised k-values + if( !flashStatus ) + { + initialiseKValues( componentProperties, pressure, temperature, compFraction, kVapourLiquid ); + flashStatus = NegativeTwoPhaseFlash::compute( m_numComponents, + pressure, + temperature, + compFraction, + componentProperties, + m_flashData, + m_continuousFlashParameters.toSliceConst(), + m_discreteFlashParameters.toSliceConst(), + kValues, + phaseFraction.value[m_vapourIndex], + phaseCompFraction.value[m_liquidIndex], + phaseCompFraction.value[m_vapourIndex] ); + } #if defined(GEOS_DEVICE_COMPILE) GEOS_ERROR_IF( !flashStatus, @@ -290,6 +322,35 @@ class NegativeTwoPhaseFlashModelUpdate final : public FunctionBaseUpdate return sumVzt / sumVz; } + template< int USD1, int USD2 > + GEOS_HOST_DEVICE + void initialiseKValues( ComponentProperties::KernelWrapper const & componentProperties, + real64 const & pressure, + real64 const & temperature, + arraySlice1d< real64 const, USD1 > const & compFraction, + arraySlice1d< real64, USD2 > const & kVapourLiquid ) const + { + if( m_flashData.liquidEos == EquationOfStateType::SoreideWhitson ) + { + // Initialise the trial compositions using SW uniform values + KValueInitialization::computeSoreideWhitsonKvalue( m_numComponents, + pressure, + temperature, + componentProperties, + compFraction, + kVapourLiquid ); + } + else + { + // Initialise the trial compositions using Wilson k-Values + KValueInitialization::computeWilsonGasLiquidKvalue( m_numComponents, + pressure, + temperature, + componentProperties, + kVapourLiquid ); + } + } + private: integer const m_numComponents; integer const m_liquidIndex; diff --git a/src/coreComponents/constitutive/unitTests/testCO2BrinePVTModels.cpp b/src/coreComponents/constitutive/unitTests/testCO2BrinePVTModels.cpp index 0cbe8e7708b..4292fc46cc6 100644 --- a/src/coreComponents/constitutive/unitTests/testCO2BrinePVTModels.cpp +++ b/src/coreComponents/constitutive/unitTests/testCO2BrinePVTModels.cpp @@ -813,8 +813,17 @@ TEST_F( BrineEnthalpyTest, BrineEnthalpyMassValuesAndDeriv ) BrineEnthalpy::KernelWrapper pvtFunctionWrapper = pvtFunction->createKernelWrapper(); real64 const savedValues[] = - { 433114, 435103, 436760, 427299, 429323, 431008, 413081, 415224, 417005, 462186, 463801, 465145, 452546, - 454218, 455609, 428974, 430843, 432394, 491259, 492499, 493530, 477794, 479113, 480210, 444868, 446462, 447782 }; + { + 433113.53565788525, 435103.27575192007, 436760.34113363025, + 427298.93567474955, 429323.06852955243, 431008.30773618678, + 413078.05207381496, 415221.258401945, 417003.17458559189, + 462186.39246929891, 463800.91559508618, 465145.3577847628, + 452546.39776041603, 454217.9404632661, 455609.09188900131, + 428969.66968518239, 430838.62367275916, 432390.05534985708, + 491259.24928071257, 492498.55543825228, 493530.37443589536, + 477793.85984608252, 479112.81239697977, 480209.87604181573, + 444861.28729654977, 446455.98894357332, 447776.93611412233 + }; integer counter = 0; for( integer iComp = 0; iComp < 3; ++iComp ) @@ -849,9 +858,17 @@ TEST_F( BrineEnthalpyTest, BrineEnthalpyMolarValuesAndDeriv ) BrineEnthalpy::KernelWrapper pvtFunctionWrapper = pvtFunction->createKernelWrapper(); real64 const savedValues[] = - { 1.87298e+07, 1.88335e+07, 1.89199e+07, 1.85976e+07, 1.87021e+07, 1.87892e+07, 1.82745e+07, 1.83817e+07, 1.84709e+07, - 1.6837e+07, 1.69154e+07, 1.69807e+07, 1.66179e+07, 1.66976e+07, 1.67639e+07, 1.60822e+07, 1.61663e+07, 1.62363e+07, - 1.49442e+07, 1.49973e+07, 1.50414e+07, 1.46382e+07, 1.4693e+07, 1.47387e+07, 1.38899e+07, 1.3951e+07, 1.40017e+07 }; + { + 12019.048701308058, 12060.270240792677, 12094.595873930279, + 11763.206302050086, 11805.941123008499, 11841.506404442765, + 11137.487423608965, 11185.461477393776, 11225.280545816589, + 15320.652926193847, 15358.677282481583, 15390.335208864433, + 14896.493159003003, 14937.026376681499, 14970.739509450927, + 13859.11712369272, 13908.336437899196, 13949.101901728583, + 18622.257151079637, 18657.08432417049, 18686.07454379859, + 18029.780015955916, 18068.111630354499, 18099.97261445909, + 16580.746823776477, 16631.211398404615, 16672.923257640578 + }; integer counter = 0; for( integer iComp = 0; iComp < 3; ++iComp ) @@ -886,8 +903,17 @@ TEST_F( CO2EnthalpyTest, CO2EnthalpyMassValuesAndDeriv ) CO2Enthalpy::KernelWrapper pvtFunctionWrapper = pvtFunction->createKernelWrapper(); real64 const savedValues[] = - { 534287, 534971, 535540, 515160, 515957, 516619, 468390, 469578, 470557, 534287, 534971, 535540, 515160, 515957, - 516619, 468390, 469578, 470557, 534287, 534971, 535540, 515160, 515957, 516619, 468390, 469578, 470557 }; + { + 534287.07736160478, 534971.06240613805, 535540.19907957152, + 515160.10373286891, 515957.22285887605, 516619.03658798116, + 468380.88136137358, 469569.68954437814, 470549.5196452348, + 534287.07736160478, 534971.06240613805, 535540.19907957152, + 515160.10373286891, 515957.22285887605, 516619.03658798116, + 468380.88136137358, 469569.68954437814, 470549.5196452348, + 534287.07736160478, 534971.06240613805, 535540.19907957152, + 515160.10373286891, 515957.22285887605, 516619.03658798116, + 468380.88136137358, 469569.68954437814, 470549.5196452348 + }; integer counter = 0; for( integer iComp = 0; iComp < 3; ++iComp ) @@ -917,16 +943,22 @@ TEST_F( CO2EnthalpyTest, CO2EnthalpyMolarValuesAndDeriv ) comp[0] = 0.304; comp[1] = 0.696; real64 const deltaComp = 0.2; - real64 const eps = sqrt( std::numeric_limits< real64 >::epsilon()); + real64 const eps = 1.0e-6; real64 const relTol = 5e-5; CO2Enthalpy::KernelWrapper pvtFunctionWrapper = pvtFunction->createKernelWrapper(); real64 const savedValues[] = - { 12142888.279686311, 12158433.374301625, 12171368.284757353, 11708186.083185773, 11726302.171616826, 11741343.217216015, - 10645237.045567034, 10672222.35656886, 10694469.203002082, 12142888.279686311, 12158433.374301625, 12171368.284757353, - 11708186.083185773, 11726302.171616826, 11741343.217216015, 10645237.045567034, 10672222.35656886, 10694469.203002082, - 12142888.279686311, 12158433.374301625, 12171368.284757353, 11708186.083185773, 11726302.171616826, 11741343.217216015, - 10645237.045567034, 10672222.35656886, 10694469.203002082 }; + { + 23508.631403910607, 23538.726745870074, 23563.768759501145, + 22667.044564246229, 22702.117805790542, 22731.237609871168, + 20608.758779900436, 20661.066339952638, 20704.178864390331, + 23508.631403910607, 23538.726745870074, 23563.768759501145, + 22667.044564246229, 22702.117805790542, 22731.237609871168, + 20608.758779900436, 20661.066339952638, 20704.178864390331, + 23508.631403910607, 23538.726745870074, 23563.768759501145, + 22667.044564246229, 22702.117805790542, 22731.237609871168, + 20608.758779900436, 20661.066339952638, 20704.178864390331 + }; integer counter = 0; for( integer iComp = 0; iComp < 3; ++iComp ) diff --git a/src/coreComponents/constitutive/unitTests/testCO2SpycherPruessModels.cpp b/src/coreComponents/constitutive/unitTests/testCO2SpycherPruessModels.cpp index 81c6cd88dd7..78a97360931 100644 --- a/src/coreComponents/constitutive/unitTests/testCO2SpycherPruessModels.cpp +++ b/src/coreComponents/constitutive/unitTests/testCO2SpycherPruessModels.cpp @@ -305,26 +305,26 @@ stdVector< TestParam > generateTestData() {1.00000000e+08, 5.00000000e+01, 1.00000000e-05, 0.00000000e+00, 1.00000000e-05, 0.00000000e+00}, {1.00000000e+08, 8.00000000e+01, 1.00000000e-05, 0.00000000e+00, 1.00000000e-05, 0.00000000e+00}, {1.00000000e+08, 1.10000000e+02, 1.00000000e-05, 0.00000000e+00, 1.00000000e-05, 0.00000000e+00}, - {1.00000000e+05, 1.00000000e+01, 3.00000000e-01, 3.03161030e-01, 8.58355906e-04, 1.23998968e-02}, - {1.00000000e+05, 5.00000000e+01, 3.00000000e-01, 3.42216891e-01, 3.10066097e-04, 1.23958952e-01}, - {1.00000000e+05, 8.00000000e+01, 3.00000000e-01, 5.66944658e-01, 1.24160030e-04, 4.70942662e-01}, + {1.00000000e+05, 1.00000000e+01, 3.00000000e-01, 0.30316629266172906, 0.00085090329021506083, 1.23998968e-02}, + {1.00000000e+05, 5.00000000e+01, 3.00000000e-01, 0.34221891417081973, 0.00030737250473219488, 1.23958952e-01}, + {1.00000000e+05, 8.00000000e+01, 3.00000000e-01, 0.56694554161147426, 0.00012308123367675458, 4.70942662e-01}, {1.00000000e+05, 1.10000000e+02, 3.00000000e-01, 3.00000000e-01, 0.00000000e+00, 0.00000000e+00}, - {1.00000000e+06, 1.00000000e+01, 3.00000000e-01, 2.94948990e-01, 8.11504677e-03, 2.27331474e-03}, - {1.00000000e+06, 5.00000000e+01, 3.00000000e-01, 3.04861076e-01, 3.32772200e-03, 2.35330303e-02}, - {1.00000000e+06, 8.00000000e+01, 3.00000000e-01, 3.35758987e-01, 2.14620607e-03, 1.10747849e-01}, - {1.00000000e+06, 1.10000000e+02, 3.00000000e-01, 3.40957999e-01, 1.62203194e-03, 1.23261476e-01}, - {5.00000000e+06, 1.00000000e+01, 3.00000000e-01, 2.79742151e-01, 2.89079228e-02, 2.01367187e-03}, - {5.00000000e+06, 5.00000000e+01, 3.00000000e-01, 2.91378214e-01, 1.36880088e-02, 3.69909366e-03}, - {5.00000000e+06, 8.00000000e+01, 3.00000000e-01, 2.97134400e-01, 9.51668603e-03, 1.28674138e-02}, - {5.00000000e+06, 1.10000000e+02, 3.00000000e-01, 3.05337535e-01, 8.04059852e-03, 3.57736478e-02}, - {1.00000000e+07, 1.00000000e+01, 3.00000000e-01, 2.78859111e-01, 3.01769401e-02, 2.22670319e-03}, - {1.00000000e+07, 5.00000000e+01, 3.00000000e-01, 2.86981820e-01, 1.98935606e-02, 4.06398711e-03}, - {1.00000000e+07, 8.00000000e+01, 3.00000000e-01, 2.91881746e-01, 1.54455782e-02, 9.65816584e-03}, - {1.00000000e+07, 1.10000000e+02, 3.00000000e-01, 2.97372350e-01, 1.38649677e-02, 2.39237441e-02}, - {1.00000000e+08, 1.00000000e+01, 3.00000000e-01, 2.78859111e-01, 3.01769401e-02, 2.22670319e-03}, - {1.00000000e+08, 5.00000000e+01, 3.00000000e-01, 2.86981820e-01, 1.98935606e-02, 4.06398711e-03}, - {1.00000000e+08, 8.00000000e+01, 3.00000000e-01, 2.91881746e-01, 1.54455782e-02, 9.65816584e-03}, - {1.00000000e+08, 1.10000000e+02, 3.00000000e-01, 2.97372350e-01, 1.38649677e-02, 2.39237441e-02}, + {1.00000000e+06, 1.00000000e+01, 3.00000000e-01, 0.29499882319684639, 0.0080450957564913543, 2.27331474e-03}, + {1.00000000e+06, 5.00000000e+01, 3.00000000e-01, 0.30488166349930129, 0.0032989000731056487, 2.35330303e-02}, + {1.00000000e+06, 8.00000000e+01, 3.00000000e-01, 0.33577292210903398, 0.002127595591701263, 1.10747849e-01}, + {1.00000000e+06, 1.10000000e+02, 3.00000000e-01, 0.34096859661779633, 0.0016079594339768342, 1.23261476e-01}, + {5.00000000e+06, 1.00000000e+01, 3.00000000e-01, 0.2799234586625956, 0.02866391855130497, 2.01367187e-03}, + {5.00000000e+06, 5.00000000e+01, 3.00000000e-01, 0.29146281934391888, 0.013570676580556669, 3.69909366e-03}, + {5.00000000e+06, 8.00000000e+01, 3.00000000e-01, 0.29719329085522239, 0.0094347679322459715, 1.28674138e-02}, + {5.00000000e+06, 1.10000000e+02, 3.00000000e-01, 0.30538788828878705, 0.0079712840925638476, 3.57736478e-02}, + {1.00000000e+07, 1.00000000e+01, 3.00000000e-01, 0.27904865261135298, 0.029922554402427436, 2.22670319e-03}, + {1.00000000e+07, 5.00000000e+01, 3.00000000e-01, 0.28710559375554839, 0.019724098763057561, 4.06398711e-03}, + {1.00000000e+07, 8.00000000e+01, 3.00000000e-01, 0.2919777311217493, 0.015313414145722523, 9.65816584e-03}, + {1.00000000e+07, 1.10000000e+02, 3.00000000e-01, 0.2974591103618851, 0.013746139793011094, 2.39237441e-02}, + {1.00000000e+08, 1.00000000e+01, 3.00000000e-01, 0.27904865261135298, 0.029922554402427436, 2.22670319e-03}, + {1.00000000e+08, 5.00000000e+01, 3.00000000e-01, 0.28710559375554839, 0.019724098763057561, 4.06398711e-03}, + {1.00000000e+08, 8.00000000e+01, 3.00000000e-01, 0.2919777311217493, 0.015313414145722523, 9.65816584e-03}, + {1.00000000e+08, 1.10000000e+02, 3.00000000e-01, 0.2974591103618851, 0.013746139793011094, 2.39237441e-02}, {1.00000000e+05, 1.00000000e+01, 9.99990000e-01, 1.00000000e+00, 0.00000000e+00, 1.00000000e-05}, {1.00000000e+05, 5.00000000e+01, 9.99990000e-01, 1.00000000e+00, 0.00000000e+00, 1.00000000e-05}, {1.00000000e+05, 8.00000000e+01, 9.99990000e-01, 1.00000000e+00, 0.00000000e+00, 1.00000000e-05}, diff --git a/src/coreComponents/constitutive/unitTests/testMultiFluidCO2Brine.cpp b/src/coreComponents/constitutive/unitTests/testMultiFluidCO2Brine.cpp index 283bbd6251b..c93e003c429 100644 --- a/src/coreComponents/constitutive/unitTests/testMultiFluidCO2Brine.cpp +++ b/src/coreComponents/constitutive/unitTests/testMultiFluidCO2Brine.cpp @@ -312,15 +312,15 @@ INSTANTIATE_TEST_SUITE_P( FluidValueTest, CO2BrinePhillipsTest, ::testing::ValuesIn({ //| pressure | temp | composition | phase fraction | phase density | phase mass density | phase viscosity | phase enthalpy | phase internal energy | density - {{5.00100e+06, 3.67650e+02, {0.300, 0.700}}, {{2.94192e-01, 7.05808e-01}, {1.87668e+03, 5.33005e+04}, {8.25738e+01, 9.70812e+02}, {1.90427e-05, 3.06891e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00}, 5.88220e+03}}, - {{5.00100e+06, 3.68000e+02, {0.300, 0.700}}, {{2.94206e-01, 7.05794e-01}, {1.87383e+03, 5.32850e+04}, {8.24487e+01, 9.70502e+02}, {1.90569e-05, 3.05730e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00}, 5.87360e+03}}, - {{5.00100e+06, 3.68750e+02, {0.300, 0.700}}, {{2.94236e-01, 7.05764e-01}, {1.86780e+03, 5.32516e+04}, {8.21833e+01, 9.69835e+02}, {1.90872e-05, 3.03243e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00}, 5.85534e+03}}, - {{7.50100e+06, 3.67650e+02, {0.300, 0.700}}, {{2.92018e-01, 7.07982e-01}, {3.05367e+03, 5.32538e+04}, {1.34361e+02, 9.74179e+02}, {2.00622e-05, 3.06891e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00}, 9.18078e+03}}, - {{7.50100e+06, 3.68000e+02, {0.300, 0.700}}, {{2.92035e-01, 7.07965e-01}, {3.04766e+03, 5.32386e+04}, {1.34097e+02, 9.73867e+02}, {2.00722e-05, 3.05730e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00}, 9.16417e+03}}, - {{7.50100e+06, 3.68750e+02, {0.300, 0.700}}, {{2.92070e-01, 7.07930e-01}, {3.03496e+03, 5.32057e+04}, {1.33538e+02, 9.73198e+02}, {2.00938e-05, 3.03243e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00}, 9.12901e+03}}, - {{1.20100e+07, 3.67650e+02, {0.300, 0.700}}, {{2.89169e-01, 7.10831e-01}, {5.77607e+03, 5.32402e+04}, {2.54147e+02, 9.79416e+02}, {2.39022e-05, 3.06891e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00}, 1.57692e+04}}, - {{1.20100e+07, 3.68000e+02, {0.300, 0.700}}, {{2.89185e-01, 7.10815e-01}, {5.75768e+03, 5.32251e+04}, {2.53338e+02, 9.79107e+02}, {2.38854e-05, 3.05730e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00}, 1.57280e+04}}, - {{1.20100e+07, 3.68750e+02, {0.300, 0.700}}, {{2.89218e-01, 7.10782e-01}, {5.71917e+03, 5.31925e+04}, {2.51643e+02, 9.78443e+02}, {2.38514e-05, 3.03243e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00}, 1.56415e+04}}, + {{5.00100e+06, 3.67650e+02, {0.300, 0.700}}, {{0.29425923996094233, 0.70574076003905761}, {1876.6771637012978, 53305.013964111968}, {82.573795202857099, 970.76392873772056}, {1.9042690398106135e-05, 0.00030689078075780307}, {0, 0}, {0, 0}, 5881.0495330397516}}, + {{5.00100e+06, 3.68000e+02, {0.300, 0.700}}, {{0.29427338244869544, 0.7057266175513045}, {1873.8349354054078, 53289.497799926183}, {82.44873715783794, 970.45381664230172}, {1.9056851253889581e-05, 0.00030573032322826445}, {0, 0}, {0, 0}, 5872.451138710232}}, + {{5.00100e+06, 3.68750e+02, {0.300, 0.700}}, {{0.29430307582076554, 0.70569692417923446}, {1867.8017150981846, 53256.094960688722}, {82.183275464320118, 969.78772926333068}, {1.908722569364096e-05, 0.00030324340751602518}, {0, 0}, {0, 0}, 5854.1990797320386}}, + {{7.50100e+06, 3.67650e+02, {0.300, 0.700}}, {{0.29211045005945158, 0.70788954994054842}, {3053.6680173832319, 53259.968646826892}, {134.36139276486219, 974.11281327244239}, {2.0062244341948444e-05, 0.00030689078075780307}, {0, 0}, {0, 0}, 9178.5148241844036}}, + {{7.50100e+06, 3.68000e+02, {0.300, 0.700}}, {{0.29212705231288177, 0.70787294768711817}, {3047.6603410545627, 53244.705654864556}, {134.09705500640075, 973.8015500126096}, {2.0072211093265288e-05, 0.00030573032322826445}, {0, 0}, {0, 0}, 9161.9054628817212}}, + {{7.50100e+06, 3.68750e+02, {0.300, 0.700}}, {{0.29216186940719618, 0.70783813059280376}, {3034.9588123747385, 53211.834244050187}, {133.53818774448848, 973.13306413318696}, {2.0093772480867798e-05, 0.00030324340751602518}, {0, 0}, {0, 0}, 9126.7704334118753}}, + {{1.20100e+07, 3.67650e+02, {0.300, 0.700}}, {{0.28929387549866292, 0.71070612450133697}, {5776.0682830082569, 53248.450886578539}, {254.14700445236329, 979.32770964345616}, {2.3902169768739735e-05, 0.00030689078075780307}, {0, 0}, {0, 0}, 15764.939745650383}}, + {{1.20100e+07, 3.68000e+02, {0.300, 0.700}}, {{0.28930965444324924, 0.7106903455567507}, {5757.678026500017, 53233.305520700458}, {253.33783316600073, 979.0188946299935}, {2.3885372962202469e-05, 0.00030573032322826445}, {0, 0}, {0, 0}, 15723.737825049826}}, + {{1.20100e+07, 3.68750e+02, {0.300, 0.700}}, {{0.28934269592211376, 0.71065730407788619}, {5719.1666421929785, 53200.683841331775}, {251.64333225649102, 978.35560186955672}, {2.3851411358173899e-05, 0.00030324340751602518}, {0, 0}, {0, 0}, 15637.263889592703}}, }) ); @@ -328,15 +328,15 @@ INSTANTIATE_TEST_SUITE_P( FluidValueTest, CO2BrineEzrokhiTest, ::testing::ValuesIn({ //| pressure | temp | composition | phase fraction | phase density | phase mass density | phase viscosity | phase enthalpy | phase internal energy | density - {{5.00100e+06, 3.67650e+02, {0.300, 0.700}}, {{2.94192e-01, 7.05808e-01}, {1.87668e+03, 5.51522e+04}, {8.25738e+01, 1.00454e+03}, {1.90427e-05, 3.12027e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00}, 5.89763e+03}}, - {{5.00100e+06, 3.68000e+02, {0.300, 0.700}}, {{2.94206e-01, 7.05794e-01}, {1.87383e+03, 5.51511e+04}, {8.24487e+01, 1.00449e+03}, {1.90569e-05, 3.10902e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00}, 5.88910e+03}}, - {{5.00100e+06, 3.68750e+02, {0.300, 0.700}}, {{2.94236e-01, 7.05764e-01}, {1.86780e+03, 5.51487e+04}, {8.21833e+01, 1.00439e+03}, {1.90872e-05, 3.08490e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00}, 5.87101e+03}}, - {{7.50100e+06, 3.67650e+02, {0.300, 0.700}}, {{2.92018e-01, 7.07982e-01}, {3.05367e+03, 5.57997e+04}, {1.34361e+02, 1.02075e+03}, {2.00622e-05, 3.16706e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00}, 9.23220e+03}}, - {{7.50100e+06, 3.68000e+02, {0.300, 0.700}}, {{2.92035e-01, 7.07965e-01}, {3.04766e+03, 5.58041e+04}, {1.34097e+02, 1.02080e+03}, {2.00722e-05, 3.15594e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00}, 9.21580e+03}}, - {{7.50100e+06, 3.68750e+02, {0.300, 0.700}}, {{2.92070e-01, 7.07930e-01}, {3.03496e+03, 5.58136e+04}, {1.33538e+02, 1.02090e+03}, {2.00938e-05, 3.13210e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00}, 9.18112e+03}}, - {{1.20100e+07, 3.67650e+02, {0.300, 0.700}}, {{2.89169e-01, 7.10831e-01}, {5.77607e+03, 5.66765e+04}, {2.54147e+02, 1.04263e+03}, {2.39022e-05, 3.22839e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00}, 1.59731e+04}}, - {{1.20100e+07, 3.68000e+02, {0.300, 0.700}}, {{2.89185e-01, 7.10815e-01}, {5.75768e+03, 5.66893e+04}, {2.53338e+02, 1.04283e+03}, {2.38854e-05, 3.21754e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00}, 1.59325e+04}}, - {{1.20100e+07, 3.68750e+02, {0.300, 0.700}}, {{2.89218e-01, 7.10782e-01}, {5.71917e+03, 5.67171e+04}, {2.51643e+02, 1.04328e+03}, {2.38514e-05, 3.19427e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00}, 1.58474e+04}}, + {{5.00100e+06, 3.67650e+02, {0.300, 0.700}}, {{0.29425923996094233, 0.70574076003905761}, {1876.6771637012978, 55134.109523922023}, {82.573795202857099, 1004.0744910963268}, {1.9042690398106135e-05, 0.00031188253134058777}, {0, 0}, {0, 0}, 5896.2804531365746}}, + {{5.00100e+06, 3.68000e+02, {0.300, 0.700}}, {{0.29427338244869544, 0.7057266175513045}, {1873.8349354054078, 55132.800406255315}, {82.44873715783794, 1004.022157936396}, {1.9056851253889581e-05, 0.00031075711115315639}, {0, 0}, {0, 0}, 5887.760285482098}}, + {{5.00100e+06, 3.68750e+02, {0.300, 0.700}}, {{0.29430307582076554, 0.70569692417923446}, {1867.8017150981846, 55130.087877585065}, {82.183275464320118, 1003.9129375962731}, {1.908722569364096e-05, 0.0003083448869739105}, {0, 0}, {0, 0}, 5869.6769017971983}}, + {{7.50100e+06, 3.67650e+02, {0.300, 0.700}}, {{0.29211045005945158, 0.70788954994054842}, {3053.6680173832319, 55774.915348820658}, {134.36139276486219, 1020.1106211824431}, {2.0062244341948444e-05, 0.00031650765699059208}, {0, 0}, {0, 0}, 9229.2833853882985}}, + {{7.50100e+06, 3.68000e+02, {0.300, 0.700}}, {{0.29212705231288177, 0.70787294768711817}, {3047.6603410545627, 55779.080038991713}, {134.09705500640075, 1020.153157617934}, {2.0072211093265288e-05, 0.00031539513670803205}, {0, 0}, {0, 0}, 9212.8925404158108}}, + {{7.50100e+06, 3.68750e+02, {0.300, 0.700}}, {{0.29216186940719618, 0.70783813059280376}, {3034.9588123747385, 55788.169647549992}, {133.53818774448848, 1020.2488458208462}, {2.0093772480867798e-05, 0.00031301031595972021}, {0, 0}, {0, 0}, 9178.2295176963744}}, + {{1.20100e+07, 3.67650e+02, {0.300, 0.700}}, {{0.28929387549866292, 0.71070612450133697}, {5776.0682830082569, 56643.071805783446}, {254.14700445236329, 1041.7604428884836}, {2.3902169768739735e-05, 0.00032257012724654506}, {0, 0}, {0, 0}, 15966.276717799727}}, + {{1.20100e+07, 3.68000e+02, {0.300, 0.700}}, {{0.28930965444324924, 0.7106903455567507}, {5757.678026500017, 56655.596406194534}, {253.33783316600073, 1041.9585788567383}, {2.3885372962202469e-05, 0.00032148402900293452}, {0, 0}, {0, 0}, 15925.678980727182}}, + {{1.20100e+07, 3.68750e+02, {0.300, 0.700}}, {{0.28934269592211376, 0.71065730407788619}, {5719.1666421929785, 56682.73097440914}, {251.64333225649102, 1042.3901230945153}, {2.3851411358173899e-05, 0.00031915537643445436}, {0, 0}, {0, 0}, 15840.526389642862}}, }) ); @@ -344,15 +344,15 @@ INSTANTIATE_TEST_SUITE_P( FluidValueTest, CO2BrinePhillipsThermalTest, ::testing::ValuesIn({ //| pressure | temp | composition | phase fraction | phase density | phase mass density | phase viscosity | phase enthalpy | phase internal energy | density - {{5.00100e+06, 3.67650e+02, {0.300, 0.700}}, {{2.94192e-01, 7.05808e-01}, {1.87668e+03, 5.33005e+04}, {8.25738e+01, 9.70812e+02}, {1.90427e-05, 3.06891e-04}, {1.21447e+07, 2.15290e+07}, {1.20841e+07, 2.15238e+07}, 5.88220e+03}}, - {{5.00100e+06, 3.68000e+02, {0.300, 0.700}}, {{2.94206e-01, 7.05794e-01}, {1.87383e+03, 5.32850e+04}, {8.24487e+01, 9.70502e+02}, {1.90569e-05, 3.05730e-04}, {1.21537e+07, 2.16115e+07}, {1.20931e+07, 2.16064e+07}, 5.87360e+03}}, - {{5.00100e+06, 3.68750e+02, {0.300, 0.700}}, {{2.94236e-01, 7.05764e-01}, {1.86780e+03, 5.32516e+04}, {8.21833e+01, 9.69835e+02}, {1.90872e-05, 3.03243e-04}, {1.21731e+07, 2.17883e+07}, {1.21123e+07, 2.17832e+07}, 5.85534e+03}}, - {{7.50100e+06, 3.67650e+02, {0.300, 0.700}}, {{2.92018e-01, 7.07982e-01}, {3.05367e+03, 5.32538e+04}, {1.34361e+02, 9.74179e+02}, {2.00622e-05, 3.06891e-04}, {1.17163e+07, 2.14953e+07}, {1.16605e+07, 2.14876e+07}, 9.18078e+03}}, - {{7.50100e+06, 3.68000e+02, {0.300, 0.700}}, {{2.92035e-01, 7.07965e-01}, {3.04766e+03, 5.32386e+04}, {1.34097e+02, 9.73867e+02}, {2.00722e-05, 3.05730e-04}, {1.17269e+07, 2.15777e+07}, {1.16709e+07, 2.15700e+07}, 9.16417e+03}}, - {{7.50100e+06, 3.68750e+02, {0.300, 0.700}}, {{2.92070e-01, 7.07930e-01}, {3.03496e+03, 5.32057e+04}, {1.33538e+02, 9.73198e+02}, {2.00938e-05, 3.03243e-04}, {1.17494e+07, 2.17542e+07}, {1.16932e+07, 2.17465e+07}, 9.12901e+03}}, - {{1.20100e+07, 3.67650e+02, {0.300, 0.700}}, {{2.89169e-01, 7.10831e-01}, {5.77607e+03, 5.32402e+04}, {2.54147e+02, 9.79416e+02}, {2.39022e-05, 3.06891e-04}, {1.08306e+07, 2.14426e+07}, {1.07833e+07, 2.14304e+07}, 1.57692e+04}}, - {{1.20100e+07, 3.68000e+02, {0.300, 0.700}}, {{2.89185e-01, 7.10815e-01}, {5.75768e+03, 5.32251e+04}, {2.53338e+02, 9.79107e+02}, {2.38854e-05, 3.05730e-04}, {1.08453e+07, 2.15248e+07}, {1.07979e+07, 2.15125e+07}, 1.57280e+04}}, - {{1.20100e+07, 3.68750e+02, {0.300, 0.700}}, {{2.89218e-01, 7.10782e-01}, {5.71917e+03, 5.31925e+04}, {2.51643e+02, 9.78443e+02}, {2.38514e-05, 3.03243e-04}, {1.08767e+07, 2.17008e+07}, {1.08290e+07, 2.16885e+07}, 1.56415e+04}}, + {{5.00100e+06, 3.67650e+02, {0.300, 0.700}}, {{0.29425923996094233, 0.70574076003905761}, {1876.6771637012978, 53305.013964111968}, {82.573795202857099, 970.76392873772056}, {1.9042690398106135e-05, 0.00030689078075780307}, {23512.098196924297, 7134.9209150422157}, {20847.281841330816, 7041.1023484929792}, 5881.0495330397516}}, + {{5.00100e+06, 3.68000e+02, {0.300, 0.700}}, {{0.29427338244869544, 0.7057266175513045}, {1873.8349354054078, 53289.497799926183}, {82.44873715783794, 970.45381664230172}, {1.9056851253889581e-05, 0.00030573032322826445}, {23529.648484157646, 7161.4005915002635}, {20860.790141564077, 7067.5547080435254}, 5872.451138710232}}, + {{5.00100e+06, 3.68750e+02, {0.300, 0.700}}, {{0.29430307582076554, 0.70569692417923446}, {1867.8017150981846, 53256.094960688722}, {82.183275464320118, 969.78772926333068}, {1.908722569364096e-05, 0.00030324340751602518}, {23567.202639605734, 7218.1284222828845}, {20889.723569116115, 7124.2236776017071}, 5854.1990797320386}}, + {{7.50100e+06, 3.67650e+02, {0.300, 0.700}}, {{0.29211045005945158, 0.70788954994054842}, {3053.6680173832319, 53259.968646826892}, {134.36139276486219, 974.11281327244239}, {2.0062244341948444e-05, 0.00030689078075780307}, {22682.777979740778, 7175.3907169914946}, {20226.387842600787, 7034.5532326561206}, 9178.5148241844036}}, + {{7.50100e+06, 3.68000e+02, {0.300, 0.700}}, {{0.29212705231288177, 0.70787294768711817}, {3047.6603410545627, 53244.705654864556}, {134.09705500640075, 973.8015500126096}, {2.0072211093265288e-05, 0.00030573032322826445}, {22703.191217798885, 7201.8386517373838}, {20241.958941040488, 7060.9607952867927}, 9161.9054628817212}}, + {{7.50100e+06, 3.68750e+02, {0.300, 0.700}}, {{0.29216186940719618, 0.70783813059280376}, {3034.9588123747385, 53211.834244050187}, {133.53818774448848, 973.13306413318696}, {2.0093772480867798e-05, 0.00030324340751602518}, {22746.780966371905, 7258.4994748145491}, {20275.24824921758, 7117.5345915970775}, 9126.7704334118753}}, + {{1.20100e+07, 3.67650e+02, {0.300, 0.700}}, {{0.28929387549866292, 0.71070612450133697}, {5776.0682830082569, 53248.450886578539}, {254.14700445236329, 979.32770964345616}, {2.3902169768739735e-05, 0.00030689078075780307}, {20967.805250887584, 7211.0130368847103}, {18888.536202886473, 6985.4665693342868}, 15764.939745650383}}, + {{1.20100e+07, 3.68000e+02, {0.300, 0.700}}, {{0.28930965444324924, 0.7106903455567507}, {5757.678026500017, 53233.305520700458}, {253.33783316600073, 979.0188946299935}, {2.3885372962202469e-05, 0.00030573032322826445}, {20996.406587066806, 7237.6170471546557}, {18910.496269622283, 7012.0064095561738}, 15723.737825049826}}, + {{1.20100e+07, 3.68750e+02, {0.300, 0.700}}, {{0.28934269592211376, 0.71065730407788619}, {5719.1666421929785, 53200.683841331775}, {251.64333225649102, 978.35560186955672}, {2.3851411358173899e-05, 0.00030324340751602518}, {21057.120003813936, 7294.6025609247663}, {18957.163707489821, 7068.8535830390838}, 15637.263889592703}}, }) ); @@ -361,15 +361,15 @@ INSTANTIATE_TEST_SUITE_P( FluidValueTest, CO2BrineEzrokhiThermalTest, ::testing::ValuesIn({ //| pressure | temp | composition | phase fraction | phase density | phase mass density | phase viscosity | phase enthalpy | phase internal energy | density | - {{5.00100e+06, 3.67650e+02, {0.300, 0.700}}, {{2.94192e-01, 7.05808e-01}, {1.87668e+03, 5.51522e+04}, {8.25738e+01, 1.00454e+03}, {1.90427e-05, 3.12027e-04}, {1.21447e+07, 2.15290e+07}, {1.20841e+07, 2.15240e+07}, 5.89763e+03}}, - {{5.00100e+06, 3.68000e+02, {0.300, 0.700}}, {{2.94206e-01, 7.05794e-01}, {1.87383e+03, 5.51511e+04}, {8.24487e+01, 1.00449e+03}, {1.90569e-05, 3.10902e-04}, {1.21537e+07, 2.16115e+07}, {1.20931e+07, 2.16065e+07}, 5.88910e+03}}, - {{5.00100e+06, 3.68750e+02, {0.300, 0.700}}, {{2.94236e-01, 7.05764e-01}, {1.86780e+03, 5.51487e+04}, {8.21833e+01, 1.00439e+03}, {1.90872e-05, 3.08490e-04}, {1.21731e+07, 2.17883e+07}, {1.21123e+07, 2.17834e+07}, 5.87101e+03}}, - {{7.50100e+06, 3.67650e+02, {0.300, 0.700}}, {{2.92018e-01, 7.07982e-01}, {3.05367e+03, 5.57997e+04}, {1.34361e+02, 1.02075e+03}, {2.00622e-05, 3.16706e-04}, {1.17163e+07, 2.14953e+07}, {1.16605e+07, 2.14880e+07}, 9.23220e+03}}, - {{7.50100e+06, 3.68000e+02, {0.300, 0.700}}, {{2.92035e-01, 7.07965e-01}, {3.04766e+03, 5.58041e+04}, {1.34097e+02, 1.02080e+03}, {2.00722e-05, 3.15594e-04}, {1.17269e+07, 2.15777e+07}, {1.16709e+07, 2.15704e+07}, 9.21580e+03}}, - {{7.50100e+06, 3.68750e+02, {0.300, 0.700}}, {{2.92070e-01, 7.07930e-01}, {3.03496e+03, 5.58136e+04}, {1.33538e+02, 1.02090e+03}, {2.00938e-05, 3.13210e-04}, {1.17494e+07, 2.17542e+07}, {1.16932e+07, 2.17468e+07}, 9.18112e+03}}, - {{1.20100e+07, 3.67650e+02, {0.300, 0.700}}, {{2.89169e-01, 7.10831e-01}, {5.77607e+03, 5.66765e+04}, {2.54147e+02, 1.04263e+03}, {2.39022e-05, 3.22839e-04}, {1.08306e+07, 2.14426e+07}, {1.07833e+07, 2.14311e+07}, 1.59731e+04}}, - {{1.20100e+07, 3.68000e+02, {0.300, 0.700}}, {{2.89185e-01, 7.10815e-01}, {5.75768e+03, 5.66893e+04}, {2.53338e+02, 1.04283e+03}, {2.38854e-05, 3.21754e-04}, {1.08453e+07, 2.15248e+07}, {1.07979e+07, 2.15133e+07}, 1.59325e+04}}, - {{1.20100e+07, 3.68750e+02, {0.300, 0.700}}, {{2.89218e-01, 7.10782e-01}, {5.71917e+03, 5.67171e+04}, {2.51643e+02, 1.04328e+03}, {2.38514e-05, 3.19427e-04}, {1.08767e+07, 2.17008e+07}, {1.08290e+07, 2.16893e+07}, 1.58474e+04}}, + {{5.00100e+06, 3.67650e+02, {0.300, 0.700}}, {{0.29425923996094233, 0.70574076003905761}, {1876.6771637012978, 55134.109523922023}, {82.573795202857099, 1004.0744910963268}, {1.9042690398106135e-05, 0.00031188253134058777}, {23512.098196924297, 7134.9209150422157}, {20847.281841330816, 7044.2148159833359}, 5896.2804531365746}}, + {{5.00100e+06, 3.68000e+02, {0.300, 0.700}}, {{0.29427338244869544, 0.7057266175513045}, {1873.8349354054078, 55132.800406255315}, {82.44873715783794, 1004.022157936396}, {1.9056851253889581e-05, 0.00031075711115315639}, {23529.648484157646, 7161.4005915002635}, {20860.790141564077, 7070.6923386426306}, 5887.760285482098}}, + {{5.00100e+06, 3.68750e+02, {0.300, 0.700}}, {{0.29430307582076554, 0.70569692417923446}, {1867.8017150981846, 55130.087877585065}, {82.183275464320118, 1003.9129375962731}, {1.908722569364096e-05, 0.0003083448869739105}, {23567.202639605734, 7218.1284222828845}, {20889.723569116115, 7127.4157063680359}, 5869.6769017971983}}, + {{7.50100e+06, 3.67650e+02, {0.300, 0.700}}, {{0.29211045005945158, 0.70788954994054842}, {3053.6680173832319, 55774.915348820658}, {134.36139276486219, 1020.1106211824431}, {2.0062244341948444e-05, 0.00031650765699059208}, {22682.777979740778, 7175.3907169914946}, {20226.387842600787, 7040.9037356471363}, 9229.2833853882985}}, + {{7.50100e+06, 3.68000e+02, {0.300, 0.700}}, {{0.29212705231288177, 0.70787294768711817}, {3047.6603410545627, 55779.080038991713}, {134.09705500640075, 1020.153157617934}, {2.0072211093265288e-05, 0.00031539513670803205}, {22703.191217798885, 7201.8386517373838}, {20241.958941040488, 7067.3617117312651}, 9212.8925404158108}}, + {{7.50100e+06, 3.68750e+02, {0.300, 0.700}}, {{0.29216186940719618, 0.70783813059280376}, {3034.9588123747385, 55788.169647549992}, {133.53818774448848, 1020.2488458208462}, {2.0093772480867798e-05, 0.00031301031595972021}, {22746.780966371905, 7258.4994748145491}, {20275.24824921758, 7124.0444452376933}, 9178.2295176963744}}, + {{1.20100e+07, 3.67650e+02, {0.300, 0.700}}, {{0.28929387549866292, 0.71070612450133697}, {5776.0682830082569, 56643.071805783446}, {254.14700445236329, 1041.7604428884836}, {2.3902169768739735e-05, 0.00032257012724654506}, {20967.805250887584, 7211.0130368847103}, {18888.536202886473, 6998.9835756086759}, 15966.276717799727}}, + {{1.20100e+07, 3.68000e+02, {0.300, 0.700}}, {{0.28930965444324924, 0.7106903455567507}, {5757.678026500017, 56655.596406194534}, {253.33783316600073, 1041.9585788567383}, {2.3885372962202469e-05, 0.00032148402900293452}, {20996.406587066806, 7237.6170471546557}, {18910.496269622283, 7025.6344582874617}, 15925.678980727182}}, + {{1.20100e+07, 3.68750e+02, {0.300, 0.700}}, {{0.28934269592211376, 0.71065730407788619}, {5719.1666421929785, 56682.73097440914}, {251.64333225649102, 1042.3901230945153}, {2.3851411358173899e-05, 0.00031915537643445436}, {21057.120003813936, 7294.6025609247663}, {18957.163707489821, 7082.7214501606741}, 15840.526389642862}}, }) ); #endif @@ -378,15 +378,15 @@ INSTANTIATE_TEST_SUITE_P( FluidValueTest, CO2BrinePhillipsSpycherPruessTest, ::testing::ValuesIn({ //| pressure | temp | composition | phase fraction | phase density | phase mass density | phase viscosity | phase enthalpy | phase internal energy | density | - {{5.00100e+06, 3.67650e+02, {0.300, 0.700}}, {{3.00488e-01, 6.99512e-01}, {1.87668e+03, 5.32842e+04}, {8.25738e+01, 9.70985e+02}, {1.90427e-05, 3.06891e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00}, 5.77217e+03}}, - {{5.00100e+06, 3.68000e+02, {0.300, 0.700}}, {{3.00580e-01, 6.99420e-01}, {1.87383e+03, 5.32686e+04}, {8.24487e+01, 9.70677e+02}, {1.90569e-05, 3.05730e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00}, 5.76239e+03}}, - {{5.00100e+06, 3.68750e+02, {0.300, 0.700}}, {{3.00781e-01, 6.99219e-01}, {1.86780e+03, 5.32348e+04}, {8.21833e+01, 9.70013e+02}, {1.90872e-05, 3.03243e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00}, 5.74154e+03}}, - {{7.50100e+06, 3.67650e+02, {0.300, 0.700}}, {{2.96731e-01, 7.03269e-01}, {3.05367e+03, 5.32295e+04}, {1.34361e+02, 9.74440e+02}, {2.00622e-05, 3.06891e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00}, 9.05928e+03}}, - {{7.50100e+06, 3.68000e+02, {0.300, 0.700}}, {{2.96804e-01, 7.03196e-01}, {3.04766e+03, 5.32141e+04}, {1.34097e+02, 9.74130e+02}, {2.00722e-05, 3.05730e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00}, 9.04143e+03}}, - {{7.50100e+06, 3.68750e+02, {0.300, 0.700}}, {{2.96962e-01, 7.03038e-01}, {3.03496e+03, 5.31808e+04}, {1.33538e+02, 9.73465e+02}, {2.00938e-05, 3.03243e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00}, 9.00358e+03}}, - {{1.20100e+07, 3.67650e+02, {0.300, 0.700}}, {{2.93050e-01, 7.06950e-01}, {5.77607e+03, 5.32048e+04}, {2.54147e+02, 9.79798e+02}, {2.39022e-05, 3.06891e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00}, 1.56195e+04}}, - {{1.20100e+07, 3.68000e+02, {0.300, 0.700}}, {{2.93105e-01, 7.06895e-01}, {5.75768e+03, 5.31894e+04}, {2.53338e+02, 9.79492e+02}, {2.38854e-05, 3.05730e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00}, 1.55771e+04}}, - {{1.20100e+07, 3.68750e+02, {0.300, 0.700}}, {{2.93225e-01, 7.06775e-01}, {5.71917e+03, 5.31561e+04}, {2.51643e+02, 9.78834e+02}, {2.38514e-05, 3.03243e-04}, {0.00000e+00, 0.00000e+00}, {0.00000e+00, 0.00000e+00}, 1.54878e+04}}, + {{5.00100e+06, 3.67650e+02, {0.300, 0.700}}, {{0.30055901953547864, 0.6994409804645213}, {1876.6771637012978, 53288.926502975992}, {82.573795202857099, 970.93528779977464}, {1.9042690398106135e-05, 0.00030689078075780307}, {0, 0}, {0, 0}, 5770.995331923642}}, + {{5.00100e+06, 3.68000e+02, {0.300, 0.700}}, {{0.30065099332750278, 0.69934900667249711}, {1873.8349354054078, 53273.265089499575}, {82.44873715783794, 970.62645912075811}, {1.9056851253889581e-05, 0.00030573032322826445}, {0, 0}, {0, 0}, 5761.2158486916578}}, + {{5.00100e+06, 3.68750e+02, {0.300, 0.700}}, {{0.30085124145379533, 0.69914875854620462}, {1867.8017150981846, 53239.531571829604}, {82.183275464320118, 969.96330012860449}, {1.908722569364096e-05, 0.00030324340751602518}, {0, 0}, {0, 0}, 5740.3797818912908}}, + {{7.50100e+06, 3.67650e+02, {0.300, 0.700}}, {{0.29682857182081501, 0.70317142817918499}, {3053.6680175979145, 53235.944853242792}, {134.36139277430823, 974.37066442194998}, {2.0062244342169086e-05, 0.00030689078075780307}, {0, 0}, {0, 0}, 9056.9433658296184}}, + {{7.50100e+06, 3.68000e+02, {0.300, 0.700}}, {{0.29690136340438578, 0.70309863659561422}, {3047.6603414195229, 53220.487452567322}, {134.09705502245899, 974.06107893123135}, {2.0072211093640384e-05, 0.00030573032322826445}, {0, 0}, {0, 0}, 9039.0992701421255}}, + {{7.50100e+06, 3.68750e+02, {0.300, 0.700}}, {{0.29705903023548158, 0.70294096976451825}, {3034.9588125464843, 53187.17198747053}, {133.5381877520453, 973.39644199990892}, {2.0093772481044313e-05, 0.00030324340751602518}, {0, 0}, {0, 0}, 9001.2678623312495}}, + {{1.20100e+07, 3.67650e+02, {0.300, 0.700}}, {{0.29318209547310786, 0.70681790452689197}, {5776.0682830082569, 53213.417559934132}, {254.14700445236329, 979.7053949450401}, {2.3902169768739735e-05, 0.00030689078075780307}, {0, 0}, {0, 0}, 15615.051798198872}}, + {{1.20100e+07, 3.68000e+02, {0.300, 0.700}}, {{0.29323762048186658, 0.70676237951813337}, {5757.678026500017, 53197.977653174094}, {253.33783316600073, 979.39914170660757}, {2.3885372962202469e-05, 0.00030573032322826445}, {0, 0}, {0, 0}, 15572.600113462746}}, + {{1.20100e+07, 3.68750e+02, {0.300, 0.700}}, {{0.29335735073442271, 0.70664264926557729}, {5719.1666421929785, 53164.689255500016}, {251.64333225649102, 978.74165946166147}, {2.3851411358173899e-05, 0.00030324340751602518}, {0, 0}, {0, 0}, 15483.399024623406}}, }) );