https://mooseframework.inl.gov
Loading...
Searching...
No Matches
Public Types | Public Member Functions | Static Public Member Functions | Public Attributes | Static Public Attributes | Protected Member Functions | Static Protected Member Functions | Protected Attributes | Static Protected Attributes | Private Member Functions | Static Private Member Functions | Private Attributes | List of all members
PorousFlowBrineCO2 Class Reference

Specialized class for brine and CO2 including calculation of mutual solubility of the two fluids using a high-accuracy fugacity-based formulation. More...

#include <PorousFlowBrineCO2.h>

Inheritance diagram for PorousFlowBrineCO2:
[legend]

Public Types

typedef DataFileName DataFileParameterType
 

Public Member Functions

 PorousFlowBrineCO2 (const InputParameters &parameters)
 
virtual std::string fluidStateName () const override
 Name of FluidState.
 
void thermophysicalProperties (Real pressure, Real temperature, Real Xnacl, Real Z, unsigned int qp, std::vector< FluidStateProperties > &fsp) const override
 Determines the complete thermophysical state of the system for a given set of primary variables.
 
void thermophysicalProperties (const ADReal &pressure, const ADReal &temperature, const ADReal &Xnacl, const ADReal &Z, unsigned int qp, std::vector< FluidStateProperties > &fsp) const override
 
void equilibriumMoleFractions (const ADReal &pressure, const ADReal &temperature, const ADReal &Xnacl, ADReal &xco2, ADReal &yh2o) const
 Mole fractions of CO2 in brine and water vapor in CO2 at equilibrium.
 
void equilibriumMassFractions (const ADReal &pressure, const ADReal &temperature, const ADReal &Xnacl, ADReal &Xco2, ADReal &Yh2o) const
 Mass fractions of CO2 in brine and water vapor in CO2 at equilibrium.
 
void massFractions (const ADReal &pressure, const ADReal &temperature, const ADReal &Xnacl, const ADReal &Z, FluidStatePhaseEnum &phase_state, std::vector< FluidStateProperties > &fsp) const
 Mass fractions of CO2 and H2O in both phases, as well as derivatives wrt PorousFlow variables.
 
void gasProperties (const ADReal &pressure, const ADReal &temperature, std::vector< FluidStateProperties > &fsp) const
 Thermophysical properties of the gaseous state.
 
void liquidProperties (const ADReal &pressure, const ADReal &temperature, const ADReal &Xnacl, std::vector< FluidStateProperties > &fsp) const
 Thermophysical properties of the liquid state.
 
ADReal saturation (const ADReal &pressure, const ADReal &temperature, const ADReal &Xnacl, const ADReal &Z, std::vector< FluidStateProperties > &fsp) const
 Gas saturation in the two-phase region.
 
void twoPhaseProperties (const ADReal &pressure, const ADReal &temperature, const ADReal &Xnacl, const ADReal &Z, unsigned int qp, std::vector< FluidStateProperties > &fsp) const
 Gas and liquid properties in the two-phase region.
 
void fugacityCoefficientsLowTemp (const ADReal &pressure, const ADReal &temperature, const ADReal &co2_density, ADReal &fco2, ADReal &fh2o) const
 Fugacity coefficients for H2O and CO2 for T <= 100C Eq.
 
ADReal activityCoefficientH2O (const ADReal &temperature, const ADReal &xco2) const
 Activity coefficient of H2O Eq.
 
ADReal activityCoefficientCO2 (const ADReal &temperature, const ADReal &xco2) const
 Activity coefficient of CO2 Eq.
 
ADReal activityCoefficient (const ADReal &pressure, const ADReal &temperature, const ADReal &Xnacl) const
 Activity coefficient for CO2 in brine.
 
ADReal activityCoefficientHighTemp (const ADReal &temperature, const ADReal &Xnacl) const
 Activity coefficient for CO2 in brine used in the elevated temperature formulation.
 
ADReal equilibriumConstantH2O (const ADReal &temperature) const
 Equilibrium constant for H2O For temperatures 12C <= T <= 99C, uses Spycher, Pruess and Ennis-King (2003) For temperatures 109C <= T <= 300C, uses Spycher and Pruess (2010) For temperatures 99C < T < 109C, the value is calculated by smoothly interpolating the two formulations.
 
ADReal equilibriumConstantCO2 (const ADReal &temperature) const
 Equilibrium constant for CO2 For temperatures 12C <= T <= 99C, uses Spycher, Pruess and Ennis-King (2003) For temperatures 109C <= T <= 300C, uses Spycher and Pruess (2010) For temperatures 99C < T < 109C, the value is calculated by smoothly interpolating the two formulations.
 
ADReal partialDensityCO2 (const ADReal &temperature) const
 Partial density of dissolved CO2 From Garcia, Density of aqueous solutions of CO2, LBNL-49023 (2001)
 
virtual Real totalMassFraction (Real pressure, Real temperature, Real Xnacl, Real saturation, unsigned int qp) const override
 Total mass fraction of fluid component summed over all phases in the two-phase state for a specified gas saturation.
 
unsigned int saltComponentIndex () const
 The index of the salt component.
 
ADReal henryConstant (const ADReal &temperature, const ADReal &Xnacl) const
 Henry's constant of dissolution of gas phase CO2 in brine.
 
ADReal enthalpyOfDissolutionGas (const ADReal &temperature, const ADReal &Xnacl) const
 Enthalpy of dissolution of gas phase CO2 in brine calculated using Henry's constant From Himmelblau, Partial molal heats and entropies of solution for gases dissolved in water from the freezing to the near critical point, J.
 
ADReal enthalpyOfDissolution (const ADReal &temperature) const
 Enthalpy of dissolution of CO2 in brine calculated using linear fit to model of Duan and Sun, An improved model calculating CO2 solubility in pure water and aqueous NaCl solutions from 273 to 533 K and from 0 to 2000 bar, Chemical geology, 193, 257–271 (2003).
 
void equilibriumMoleFractionsLowTemp (const ADReal &pressure, const ADReal &temperature, const ADReal &Xnacl, ADReal &xco2, ADReal &yh2o) const
 Mole fractions of CO2 in brine and water vapor in CO2 at equilibrium in the low temperature regime (T <= 99C).
 
void solveEquilibriumMoleFractionHighTemp (Real pressure, Real temperature, Real Xnacl, Real co2_density, Real &xco2, Real &yh2o) const
 Function to solve for yh2o and xco2 iteratively in the elevated temperature regime (T > 100C)
 
unsigned int aqueousComponentIndex () const
 The index of the aqueous fluid component.
 
unsigned int gasComponentIndex () const
 The index of the gas fluid component.
 
void phaseState (Real Zi, Real Xi, Real Yi, FluidStatePhaseEnum &phase_state) const
 Determines the phase state gven the total mass fraction and equilibrium mass fractions.
 
unsigned int getPressureIndex () const
 
unsigned int getTemperatureIndex () const
 
unsigned int getZIndex () const
 
unsigned int getXIndex () const
 
Real rachfordRice (Real vf, std::vector< Real > &Zi, std::vector< Real > &Ki) const
 Rachford-Rice equation for vapor fraction.
 
Real rachfordRiceDeriv (Real vf, std::vector< Real > &Zi, std::vector< Real > &Ki) const
 Derivative of Rachford-Rice equation wrt vapor fraction.
 
Real vaporMassFraction (Real Z0, Real K0, Real K1) const
 Solves Rachford-Rice equation to provide vapor mass fraction.
 
ADReal vaporMassFraction (const ADReal &Z0, const ADReal &K0, const ADReal &K1) const
 
Real vaporMassFraction (std::vector< Real > &Zi, std::vector< Real > &Ki) const
 
void initialize () final
 
void execute () final
 
void finalize () final
 
unsigned int numPhases () const
 The maximum number of phases in this model.
 
unsigned int numComponents () const
 The maximum number of components in this model.
 
unsigned int aqueousPhaseIndex () const
 The index of the aqueous phase.
 
unsigned int gasPhaseIndex () const
 The index of the gas phase.
 
void clearFluidStateProperties (std::vector< FluidStateProperties > &fsp) const
 Clears the contents of the FluidStateProperties data structure.
 
virtual Real spatialValue (const Point &) const
 
virtual const std::vector< Point > spatialPoints () const
 
void setPrimaryThreadCopy (UserObject *primary)
 
UserObject * primaryThreadCopy ()
 
SubProblem & getSubProblem () const
 
bool shouldDuplicateInitialExecution () const
 
void gatherSum (T &value)
 
void gatherMax (T &value)
 
void gatherMin (T &value)
 
void gatherProxyValueMax (T1 &proxy, T2 &value)
 
void gatherProxyValueMin (T1 &proxy, T2 &value)
 
std::set< UserObjectName > getDependObjects () const
 
const std::set< std::string > & getRequestedItems () override
 
const std::set< std::string > & getSuppliedItems () override
 
unsigned int systemNumber () const
 
virtual bool needThreadedCopy () const
 
virtual bool enabled () const
 
std::shared_ptr< MooseObject > getSharedPtr ()
 
std::shared_ptr< const MooseObject > getSharedPtr () const
 
bool isKokkosObject () const
 
MooseApp & getMooseApp () const
 
const std::string & type () const
 
const std::string & name () const
 
std::string typeAndName () const
 
MooseObjectParameterName uniqueParameterName (const std::string &parameter_name) const
 
MooseObjectName uniqueName () const
 
const InputParameters & parameters () const
 
const hit::Node * getHitNode () const
 
bool hasBase () const
 
const std::string & getBase () const
 
const T & getParam (const std::string &name) const
 
std::vector< std::pair< T1, T2 > > getParam (const std::string &param1, const std::string &param2) const
 
const T * queryParam (const std::string &name) const
 
const T & getRenamedParam (const std::string &old_name, const std::string &new_name) const
 
T getCheckedPointerParam (const std::string &name, const std::string &error_string="") const
 
bool isParamValid (const std::string &name) const
 
bool isParamSetByUser (const std::string &name) const
 
void connectControllableParams (const std::string &parameter, const std::string &object_type, const std::string &object_name, const std::string &object_parameter) const
 
void paramError (const std::string &param, Args... args) const
 
void paramWarning (const std::string &param, Args... args) const
 
void paramWarning (const std::string &param, Args... args) const
 
void paramInfo (const std::string &param, Args... args) const
 
std::string messagePrefix (const bool hit_prefix=true) const
 
std::string errorPrefix (const std::string &) const
 
void mooseError (Args &&... args) const
 
void mooseDocumentedError (const std::string &repo_name, const unsigned int issue_num, Args &&... args) const
 
void mooseErrorNonPrefixed (Args &&... args) const
 
void mooseWarning (Args &&... args) const
 
void mooseWarning (Args &&... args) const
 
void mooseWarningNonPrefixed (Args &&... args) const
 
void mooseWarningNonPrefixed (Args &&... args) const
 
void mooseDeprecated (Args &&... args) const
 
void mooseDeprecated (Args &&... args) const
 
void mooseDeprecatedNoTrace (Args &&... args) const
 
void mooseInfo (Args &&... args) const
 
void callMooseError (std::string msg, const bool with_prefix, const hit::Node *node=nullptr, const bool show_trace=true) const
 
std::string getDataFileName (const std::string &param) const
 
std::string getDataFileNameByName (const std::string &relative_path) const
 
std::string getDataFilePath (const std::string &relative_path) const
 
virtual void initialSetup ()
 
virtual void timestepSetup ()
 
virtual void jacobianSetup ()
 
virtual void residualSetup ()
 
virtual void customSetup (const ExecFlagType &)
 
const ExecFlagEnum & getExecuteOnEnum () const
 
UserObjectName getUserObjectName (const std::string &param_name) const
 
const T & getUserObject (const std::string &param_name, bool is_dependency=true) const
 
const T & getUserObjectByName (const UserObjectName &object_name, bool is_dependency=true) const
 
const UserObjectBase & getUserObjectBase (const std::string &param_name, bool is_dependency=true) const
 
const UserObjectBase & getUserObjectBaseByName (const UserObjectName &object_name, bool is_dependency=true) const
 
const std::vector< MooseVariableScalar * > & getCoupledMooseScalarVars ()
 
const std::set< TagID > & getScalarVariableCoupleableVectorTags () const
 
const std::set< TagID > & getScalarVariableCoupleableMatrixTags () const
 
const GenericMaterialProperty< T, is_ad > & getGenericMaterialProperty (const std::string &name, MaterialData &material_data, const unsigned int state=0)
 
const GenericMaterialProperty< T, is_ad > & getGenericMaterialProperty (const std::string &name, const unsigned int state=0)
 
const GenericMaterialProperty< T, is_ad > & getGenericMaterialProperty (const std::string &name, const unsigned int state=0)
 
const MaterialProperty< T > & getMaterialProperty (const std::string &name, MaterialData &material_data, const unsigned int state=0)
 
const MaterialProperty< T > & getMaterialProperty (const std::string &name, const unsigned int state=0)
 
const MaterialProperty< T > & getMaterialProperty (const std::string &name, const unsigned int state=0)
 
const ADMaterialProperty< T > & getADMaterialProperty (const std::string &name, MaterialData &material_data)
 
const ADMaterialProperty< T > & getADMaterialProperty (const std::string &name)
 
const ADMaterialProperty< T > & getADMaterialProperty (const std::string &name)
 
const MaterialProperty< T > & getMaterialPropertyOld (const std::string &name, MaterialData &material_data)
 
const MaterialProperty< T > & getMaterialPropertyOld (const std::string &name)
 
const MaterialProperty< T > & getMaterialPropertyOld (const std::string &name)
 
const MaterialProperty< T > & getMaterialPropertyOlder (const std::string &name, MaterialData &material_data)
 
const MaterialProperty< T > & getMaterialPropertyOlder (const std::string &name)
 
const MaterialProperty< T > & getMaterialPropertyOlder (const std::string &name)
 
const GenericMaterialProperty< T, is_ad > & getGenericMaterialPropertyByName (const MaterialPropertyName &name, MaterialData &material_data, const unsigned int state)
 
const GenericMaterialProperty< T, is_ad > & getGenericMaterialPropertyByName (const MaterialPropertyName &name, const unsigned int state=0)
 
const GenericMaterialProperty< T, is_ad > & getGenericMaterialPropertyByName (const MaterialPropertyName &name, const unsigned int state=0)
 
const MaterialProperty< T > & getMaterialPropertyByName (const MaterialPropertyName &name, MaterialData &material_data, const unsigned int state=0)
 
const MaterialProperty< T > & getMaterialPropertyByName (const MaterialPropertyName &name, const unsigned int state=0)
 
const MaterialProperty< T > & getMaterialPropertyByName (const MaterialPropertyName &name, const unsigned int state=0)
 
const ADMaterialProperty< T > & getADMaterialPropertyByName (const MaterialPropertyName &name, MaterialData &material_data)
 
const ADMaterialProperty< T > & getADMaterialPropertyByName (const MaterialPropertyName &name)
 
const ADMaterialProperty< T > & getADMaterialPropertyByName (const MaterialPropertyName &name)
 
const MaterialProperty< T > & getMaterialPropertyOldByName (const MaterialPropertyName &name, MaterialData &material_data)
 
const MaterialProperty< T > & getMaterialPropertyOldByName (const MaterialPropertyName &name)
 
const MaterialProperty< T > & getMaterialPropertyOldByName (const MaterialPropertyName &name)
 
const MaterialProperty< T > & getMaterialPropertyOlderByName (const MaterialPropertyName &name, MaterialData &material_data)
 
const MaterialProperty< T > & getMaterialPropertyOlderByName (const MaterialPropertyName &name)
 
const MaterialProperty< T > & getMaterialPropertyOlderByName (const MaterialPropertyName &name)
 
Moose::Kokkos::MaterialProperty< T, dimension > getKokkosMaterialPropertyByName (const std::string &prop_name_in)
 
Moose::Kokkos::MaterialProperty< T, dimension > getKokkosMaterialPropertyOldByName (const std::string &prop_name)
 
Moose::Kokkos::MaterialProperty< T, dimension > getKokkosMaterialPropertyOlderByName (const std::string &prop_name)
 
Moose::Kokkos::MaterialProperty< T, dimension > getKokkosMaterialProperty (const std::string &name)
 
Moose::Kokkos::MaterialProperty< T, dimension > getKokkosMaterialPropertyOld (const std::string &name)
 
Moose::Kokkos::MaterialProperty< T, dimension > getKokkosMaterialPropertyOlder (const std::string &name)
 
std::pair< const MaterialProperty< T > *, std::set< SubdomainID > > getBlockMaterialProperty (const MaterialPropertyName &name)
 
std::pair< Moose::Kokkos::MaterialProperty< T, dimension >, std::set< SubdomainID > > getKokkosBlockMaterialProperty (const MaterialPropertyName &name)
 
const GenericMaterialProperty< T, is_ad > & getGenericZeroMaterialProperty (const std::string &name)
 
const GenericMaterialProperty< T, is_ad > & getGenericZeroMaterialProperty ()
 
const GenericMaterialProperty< T, is_ad > & getGenericZeroMaterialPropertyByName (const std::string &prop_name)
 
const MaterialProperty< T > & getZeroMaterialProperty (Ts... args)
 
std::set< SubdomainID > getMaterialPropertyBlocks (const std::string &name)
 
std::vector< SubdomainName > getMaterialPropertyBlockNames (const std::string &name)
 
std::set< BoundaryID > getMaterialPropertyBoundaryIDs (const std::string &name)
 
std::vector< BoundaryName > getMaterialPropertyBoundaryNames (const std::string &name)
 
void checkBlockAndBoundaryCompatibility (std::shared_ptr< MaterialBase > discrete)
 
std::unordered_map< SubdomainID, std::vector< MaterialBase * > > buildRequiredMaterials (bool allow_stateful=true)
 
void statefulPropertiesAllowed (bool)
 
virtual bool getMaterialPropertyCalled () const
 
virtual const std::unordered_set< unsigned int > & getMatPropDependencies () const
 
virtual void resolveOptionalProperties ()
 
const GenericMaterialProperty< T, is_ad > & getPossiblyConstantGenericMaterialPropertyByName (const MaterialPropertyName &prop_name, MaterialData &material_data, const unsigned int state)
 
bool isImplicit ()
 
Moose::StateArg determineState () const
 
virtual void threadJoin (const UserObject &) override
 
virtual void threadJoin (const UserObject &) override
 
virtual void subdomainSetup () override
 
virtual void subdomainSetup () override
 
bool hasUserObject (const std::string &param_name) const
 
bool hasUserObject (const std::string &param_name) const
 
bool hasUserObject (const std::string &param_name) const
 
bool hasUserObject (const std::string &param_name) const
 
bool hasUserObjectByName (const UserObjectName &object_name) const
 
bool hasUserObjectByName (const UserObjectName &object_name) const
 
bool hasUserObjectByName (const UserObjectName &object_name) const
 
bool hasUserObjectByName (const UserObjectName &object_name) const
 
const GenericOptionalMaterialProperty< T, is_ad > & getGenericOptionalMaterialProperty (const std::string &name, const unsigned int state=0)
 
const GenericOptionalMaterialProperty< T, is_ad > & getGenericOptionalMaterialProperty (const std::string &name, const unsigned int state=0)
 
const OptionalMaterialProperty< T > & getOptionalMaterialProperty (const std::string &name, const unsigned int state=0)
 
const OptionalMaterialProperty< T > & getOptionalMaterialProperty (const std::string &name, const unsigned int state=0)
 
const OptionalADMaterialProperty< T > & getOptionalADMaterialProperty (const std::string &name)
 
const OptionalADMaterialProperty< T > & getOptionalADMaterialProperty (const std::string &name)
 
const OptionalMaterialProperty< T > & getOptionalMaterialPropertyOld (const std::string &name)
 
const OptionalMaterialProperty< T > & getOptionalMaterialPropertyOld (const std::string &name)
 
const OptionalMaterialProperty< T > & getOptionalMaterialPropertyOlder (const std::string &name)
 
const OptionalMaterialProperty< T > & getOptionalMaterialPropertyOlder (const std::string &name)
 
MaterialBase & getMaterial (const std::string &name)
 
MaterialBase & getMaterial (const std::string &name)
 
MaterialBase & getMaterialByName (const std::string &name, bool no_warn=false)
 
MaterialBase & getMaterialByName (const std::string &name, bool no_warn=false)
 
bool hasMaterialProperty (const std::string &name)
 
bool hasMaterialProperty (const std::string &name)
 
bool hasMaterialPropertyByName (const std::string &name)
 
bool hasMaterialPropertyByName (const std::string &name)
 
bool hasADMaterialProperty (const std::string &name)
 
bool hasADMaterialProperty (const std::string &name)
 
bool hasADMaterialPropertyByName (const std::string &name)
 
bool hasADMaterialPropertyByName (const std::string &name)
 
bool hasKokkosMaterialProperty (const std::string &name)
 
bool hasKokkosMaterialProperty (const std::string &name)
 
bool hasKokkosMaterialPropertyByName (const std::string &name)
 
bool hasKokkosMaterialPropertyByName (const std::string &name)
 
bool hasGenericMaterialProperty (const std::string &name)
 
bool hasGenericMaterialProperty (const std::string &name)
 
bool hasGenericMaterialPropertyByName (const std::string &name)
 
bool hasGenericMaterialPropertyByName (const std::string &name)
 
const Function & getFunction (const std::string &name) const
 
const Function & getFunctionByName (const FunctionName &name) const
 
bool hasFunction (const std::string &param_name) const
 
bool hasFunctionByName (const FunctionName &name) const
 
Moose::Kokkos::Function getKokkosFunction (const std::string &name) const
 
const T & getKokkosFunction (const std::string &name) const
 
Moose::Kokkos::Function getKokkosFunctionByName (const FunctionName &name) const
 
const T & getKokkosFunctionByName (const FunctionName &name) const
 
bool hasKokkosFunction (const std::string &param_name) const
 
bool hasKokkosFunctionByName (const FunctionName &name) const
 
bool isDefaultPostprocessorValue (const std::string &param_name, const unsigned int index=0) const
 
bool hasPostprocessor (const std::string &param_name, const unsigned int index=0) const
 
bool hasPostprocessorByName (const PostprocessorName &name) const
 
std::size_t coupledPostprocessors (const std::string &param_name) const
 
const PostprocessorName & getPostprocessorName (const std::string &param_name, const unsigned int index=0) const
 
const VectorPostprocessorValue & getVectorPostprocessorValue (const std::string &param_name, const std::string &vector_name) const
 
const VectorPostprocessorValue & getVectorPostprocessorValue (const std::string &param_name, const std::string &vector_name, bool needs_broadcast) const
 
const VectorPostprocessorValue & getVectorPostprocessorValueByName (const VectorPostprocessorName &name, const std::string &vector_name) const
 
const VectorPostprocessorValue & getVectorPostprocessorValueByName (const VectorPostprocessorName &name, const std::string &vector_name, bool needs_broadcast) const
 
const VectorPostprocessorValue & getVectorPostprocessorValueOld (const std::string &param_name, const std::string &vector_name) const
 
const VectorPostprocessorValue & getVectorPostprocessorValueOld (const std::string &param_name, const std::string &vector_name, bool needs_broadcast) const
 
const VectorPostprocessorValue & getVectorPostprocessorValueOldByName (const VectorPostprocessorName &name, const std::string &vector_name) const
 
const VectorPostprocessorValue & getVectorPostprocessorValueOldByName (const VectorPostprocessorName &name, const std::string &vector_name, bool needs_broadcast) const
 
const ScatterVectorPostprocessorValue & getScatterVectorPostprocessorValue (const std::string &param_name, const std::string &vector_name) const
 
const ScatterVectorPostprocessorValue & getScatterVectorPostprocessorValueByName (const VectorPostprocessorName &name, const std::string &vector_name) const
 
const ScatterVectorPostprocessorValue & getScatterVectorPostprocessorValueOld (const std::string &param_name, const std::string &vector_name) const
 
const ScatterVectorPostprocessorValue & getScatterVectorPostprocessorValueOldByName (const VectorPostprocessorName &name, const std::string &vector_name) const
 
bool hasVectorPostprocessor (const std::string &param_name, const std::string &vector_name) const
 
bool hasVectorPostprocessor (const std::string &param_name) const
 
bool hasVectorPostprocessorByName (const VectorPostprocessorName &name, const std::string &vector_name) const
 
bool hasVectorPostprocessorByName (const VectorPostprocessorName &name) const
 
const VectorPostprocessorName & getVectorPostprocessorName (const std::string &param_name) const
 
T & getSampler (const std::string &name)
 
Sampler & getSampler (const std::string &name)
 
T & getSamplerByName (const SamplerName &name)
 
Sampler & getSamplerByName (const SamplerName &name)
 
virtual void meshChanged ()
 
virtual void meshDisplaced ()
 
PerfGraph & perfGraph ()
 
const PostprocessorValue & getPostprocessorValue (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValue & getPostprocessorValue (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValue & getPostprocessorValueOld (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValue & getPostprocessorValueOld (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValue & getPostprocessorValueOlder (const std::string &param_name, const unsigned int index=0) const
 
const PostprocessorValue & getPostprocessorValueOlder (const std::string &param_name, const unsigned int index=0) const
 
virtual const PostprocessorValue & getPostprocessorValueByName (const PostprocessorName &name) const
 
virtual const PostprocessorValue & getPostprocessorValueByName (const PostprocessorName &name) const
 
const PostprocessorValue & getPostprocessorValueOldByName (const PostprocessorName &name) const
 
const PostprocessorValue & getPostprocessorValueOldByName (const PostprocessorName &name) const
 
const PostprocessorValue & getPostprocessorValueOlderByName (const PostprocessorName &name) const
 
const PostprocessorValue & getPostprocessorValueOlderByName (const PostprocessorName &name) const
 
bool isVectorPostprocessorDistributed (const std::string &param_name) const
 
bool isVectorPostprocessorDistributed (const std::string &param_name) const
 
bool isVectorPostprocessorDistributedByName (const VectorPostprocessorName &name) const
 
bool isVectorPostprocessorDistributedByName (const VectorPostprocessorName &name) const
 
const Distribution & getDistribution (const std::string &name) const
 
const T & getDistribution (const std::string &name) const
 
const Distribution & getDistribution (const std::string &name) const
 
const T & getDistribution (const std::string &name) const
 
const Distribution & getDistributionByName (const DistributionName &name) const
 
const T & getDistributionByName (const std::string &name) const
 
const Distribution & getDistributionByName (const DistributionName &name) const
 
const T & getDistributionByName (const std::string &name) const
 
const Parallel::Communicator & comm () const
 
processor_id_type n_processors () const
 
processor_id_type processor_id () const
 
void fugacityCoefficientsHighTemp (const ADReal &pressure, const ADReal &temperature, const ADReal &co2_density, const ADReal &xco2, const ADReal &yh2o, ADReal &fco2, ADReal &fh2o) const
 Fugacity coefficients for H2O and CO2 at elevated temperatures (100C < T <= 300C).
 
ADReal fugacityCoefficientH2OHighTemp (const ADReal &pressure, const ADReal &temperature, const ADReal &co2_density, const ADReal &xco2, const ADReal &yh2o) const
 
ADReal fugacityCoefficientCO2HighTemp (const ADReal &pressure, const ADReal &temperature, const ADReal &co2_density, const ADReal &xco2, const ADReal &yh2o) const
 

Static Public Member Functions

static InputParameters validParams ()
 
static void callMooseError (MooseApp *const app, const InputParameters &params, std::string msg, const bool with_prefix, const hit::Node *node, const bool show_trace=true)
 
static void sort (typename std::vector< T > &vector)
 
static void sortDFS (typename std::vector< T > &vector)
 
static void cyclicDependencyError (CyclicDependencyException< T2 > &e, const std::string &header, NameFunc &&name_func)
 
static void cyclicDependencyError (CyclicDependencyException< T2 > &e, const std::string &header)
 

Public Attributes

 usingCombinedWarningSolutionWarnings
 
const ConsoleStream _console
 

Static Public Attributes

static const std::string type_param
 
static const std::string name_param
 
static const std::string unique_name_param
 
static const std::string app_param
 
static const std::string moose_base_param
 
static const std::string kokkos_object_param
 
static constexpr PropertyValue::id_type default_property_id
 
static constexpr PropertyValue::id_type zero_property_id
 
static constexpr auto SYSTEM
 
static constexpr auto NAME
 

Protected Member Functions

virtual void checkVariables (Real pressure, Real temperature) const
 Check the input variables.
 
void smoothCubicInterpolation (Real temperature, Real f0, Real df0, Real f1, Real df1, Real &value, Real &deriv) const
 Cubic function to smoothly interpolate between the low temperature and elevated temperature models for 99C < T < 109C.
 
virtual void addPostprocessorDependencyHelper (const PostprocessorName &name) const override
 
virtual void addVectorPostprocessorDependencyHelper (const VectorPostprocessorName &name) const override
 
virtual void addUserObjectDependencyHelper (const UserObjectBase &uo) const override
 
void addReporterDependencyHelper (const ReporterName &reporter_name) override
 
void flagInvalidSolutionInternal (const InvalidSolutionID invalid_solution_id) const
 
InvalidSolutionID registerInvalidSolutionInternal (const std::string &message, const bool warning) const
 
const ReporterContextBase & getReporterContextBaseByName (const ReporterName &reporter_name) const
 
const ReporterName & getReporterName (const std::string &param_name) const
 
T & declareRestartableData (const std::string &data_name, Args &&... args)
 
ManagedValue< T > declareManagedRestartableDataWithContext (const std::string &data_name, void *context, Args &&... args)
 
const T & getRestartableData (const std::string &data_name) const
 
T & declareRestartableDataWithContext (const std::string &data_name, void *context, Args &&... args)
 
T & declareRecoverableData (const std::string &data_name, Args &&... args)
 
T & declareRestartableDataWithObjectName (const std::string &data_name, const std::string &object_name, Args &&... args)
 
T & declareRestartableDataWithObjectNameWithContext (const std::string &data_name, const std::string &object_name, void *context, Args &&... args)
 
std::string restartableName (const std::string &data_name) const
 
const T & getMeshProperty (const std::string &data_name, const std::string &prefix)
 
const T & getMeshProperty (const std::string &data_name)
 
bool hasMeshProperty (const std::string &data_name, const std::string &prefix) const
 
bool hasMeshProperty (const std::string &data_name, const std::string &prefix) const
 
bool hasMeshProperty (const std::string &data_name) const
 
bool hasMeshProperty (const std::string &data_name) const
 
std::string meshPropertyName (const std::string &data_name) const
 
PerfID registerTimedSection (const std::string &section_name, const unsigned int level) const
 
PerfID registerTimedSection (const std::string &section_name, const unsigned int level, const std::string &live_message, const bool print_dots=true) const
 
std::string timedSectionName (const std::string &section_name) const
 
bool isCoupledScalar (const std::string &var_name, unsigned int i=0) const
 
unsigned int coupledScalarComponents (const std::string &var_name) const
 
unsigned int coupledScalar (const std::string &var_name, unsigned int comp=0) const
 
libMesh::Order coupledScalarOrder (const std::string &var_name, unsigned int comp=0) const
 
const VariableValue & coupledScalarValue (const std::string &var_name, unsigned int comp=0) const
 
const ADVariableValue & adCoupledScalarValue (const std::string &var_name, unsigned int comp=0) const
 
const GenericVariableValue< is_ad > & coupledGenericScalarValue (const std::string &var_name, unsigned int comp=0) const
 
const GenericVariableValue< false > & coupledGenericScalarValue (const std::string &var_name, const unsigned int comp) const
 
const GenericVariableValue< true > & coupledGenericScalarValue (const std::string &var_name, const unsigned int comp) const
 
const VariableValue & coupledVectorTagScalarValue (const std::string &var_name, const std::string &tag_param_name, unsigned int comp=0) const
 
const VariableValue & coupledMatrixTagScalarValue (const std::string &var_name, const std::string &tag_param_name, unsigned int comp=0) const
 
const VariableValue & coupledScalarValueOld (const std::string &var_name, unsigned int comp=0) const
 
const VariableValue & coupledScalarValueOlder (const std::string &var_name, unsigned int comp=0) const
 
const VariableValue & coupledScalarDot (const std::string &var_name, unsigned int comp=0) const
 
const ADVariableValue & adCoupledScalarDot (const std::string &var_name, unsigned int comp=0) const
 
const VariableValue & coupledScalarDotDot (const std::string &var_name, unsigned int comp=0) const
 
const VariableValue & coupledScalarDotOld (const std::string &var_name, unsigned int comp=0) const
 
const VariableValue & coupledScalarDotDotOld (const std::string &var_name, unsigned int comp=0) const
 
const VariableValue & coupledScalarDotDu (const std::string &var_name, unsigned int comp=0) const
 
const VariableValue & coupledScalarDotDotDu (const std::string &var_name, unsigned int comp=0) const
 
Moose::Kokkos::VariableValue kokkosCoupledVectorTagScalarValueByName (const std::string &var_name, const std::string &tag_name, unsigned int comp=0) const
 
Moose::Kokkos::VariableValue kokkosCoupledVectorTagScalarValue (const std::string &var_name, const std::string &tag_param_name, unsigned int comp=0) const
 
Moose::Kokkos::VariableValue kokkosCoupledScalarValue (const std::string &var_name, unsigned int comp=0) const
 
Moose::Kokkos::VariableValue kokkosCoupledScalarValueOld (const std::string &var_name, unsigned int comp=0) const
 
Moose::Kokkos::VariableValue kokkosCoupledScalarValueOlder (const std::string &var_name, unsigned int comp=0) const
 
Moose::Kokkos::VariableValue kokkosCoupledScalarDot (const std::string &var_name, unsigned int comp=0) const
 
Moose::Kokkos::Scalar< const Real > kokkosCoupledScalarDotDu (const std::string &var_name, unsigned int comp=0) const
 
const MooseVariableScalar * getScalarVar (const std::string &var_name, unsigned int comp) const
 
virtual void checkMaterialProperty (const std::string &name, const unsigned int state)
 
virtual void getKokkosMaterialPropertyHook (const std::string &, const unsigned int)
 
void markMatPropRequested (const std::string &)
 
MaterialPropertyName getMaterialPropertyName (const std::string &name) const
 
void checkExecutionStage ()
 
const T & getReporterValue (const std::string &param_name, const std::size_t time_index=0)
 
const T & getReporterValue (const std::string &param_name, ReporterMode mode, const std::size_t time_index=0)
 
const T & getReporterValue (const std::string &param_name, const std::size_t time_index=0)
 
const T & getReporterValue (const std::string &param_name, ReporterMode mode, const std::size_t time_index=0)
 
const T & getReporterValueByName (const ReporterName &reporter_name, const std::size_t time_index=0)
 
const T & getReporterValueByName (const ReporterName &reporter_name, ReporterMode mode, const std::size_t time_index=0)
 
const T & getReporterValueByName (const ReporterName &reporter_name, const std::size_t time_index=0)
 
const T & getReporterValueByName (const ReporterName &reporter_name, ReporterMode mode, const std::size_t time_index=0)
 
bool hasReporterValue (const std::string &param_name) const
 
bool hasReporterValue (const std::string &param_name) const
 
bool hasReporterValue (const std::string &param_name) const
 
bool hasReporterValue (const std::string &param_name) const
 
bool hasReporterValueByName (const ReporterName &reporter_name) const
 
bool hasReporterValueByName (const ReporterName &reporter_name) const
 
bool hasReporterValueByName (const ReporterName &reporter_name) const
 
bool hasReporterValueByName (const ReporterName &reporter_name) const
 
const GenericMaterialProperty< T, is_ad > * defaultGenericMaterialProperty (const std::string &name)
 
const GenericMaterialProperty< T, is_ad > * defaultGenericMaterialProperty (const std::string &name)
 
const MaterialProperty< T > * defaultMaterialProperty (const std::string &name)
 
const MaterialProperty< T > * defaultMaterialProperty (const std::string &name)
 
const ADMaterialProperty< T > * defaultADMaterialProperty (const std::string &name)
 
const ADMaterialProperty< T > * defaultADMaterialProperty (const std::string &name)
 
void funcABHighTemp (Real pressure, Real temperature, Real Xnacl, Real co2_density, Real xco2, Real yh2o, Real &A, Real &B) const
 The function A (Eq.
 
void funcABHighTemp (Real pressure, Real temperature, Real Xnacl, Real co2_density, Real xco2, Real yh2o, Real &A, Real &dA_dp, Real &dA_dT, Real &B, Real &dB_dp, Real &dB_dT, Real &dB_dX) const
 
void funcABLowTemp (const ADReal &pressure, const ADReal &temperature, const ADReal &co2_density, ADReal &A, ADReal &B) const
 

Static Protected Member Functions

static std::string meshPropertyName (const std::string &data_name, const std::string &prefix)
 

Protected Attributes

const unsigned int _salt_component
 Salt component index.
 
const BrineFluidProperties & _brine_fp
 Fluid properties UserObject for water.
 
const SinglePhaseFluidProperties & _co2_fp
 Fluid properties UserObject for the CO2.
 
const Real _Mh2o
 Molar mass of water (kg/mol)
 
const Real _invMh2o
 Inverse of molar mass of H2O (mol/kg)
 
const Real _Mco2
 Molar mass of CO2 (kg/mol)
 
const Real _Mnacl
 Molar mass of NaCL.
 
const Real _Rbar
 Molar gas constant in bar cm^3 /(K mol)
 
const Real _Tlower
 Temperature below which the Spycher, Pruess & Ennis-King (2003) model is used (K)
 
const Real _Tupper
 Temperature above which the Spycher & Pruess (2010) model is used (K)
 
const Real _Zmin
 Minimum Z - below this value all CO2 will be dissolved.
 
const std::vector< Real > _co2_henry
 Henry's coefficeients for CO2.
 
const unsigned int _aqueous_fluid_component
 Fluid component number of the aqueous component.
 
unsigned int _gas_fluid_component
 Fluid component number of the gas phase.
 
const bool _compute_internal_energy
 Whether to compute the internal energy of each phase.
 
const bool _compute_enthalpy
 Whether to compute the enthalpy of each phase.
 
const unsigned int _pidx
 Index of derivative wrt pressure.
 
const unsigned int _Zidx
 Index of derivative wrt total mass fraction Z.
 
const unsigned int _Tidx
 Index of derivative wrt temperature.
 
const unsigned int _Xidx
 Index of derivative wrt salt mass fraction X.
 
const Real _nr_max_its
 Maximum number of iterations for the Newton-Raphson routine.
 
const Real _nr_tol
 Tolerance for Newton-Raphson iterations.
 
unsigned int _num_phases
 Number of phases.
 
unsigned int _num_components
 Number of components.
 
const unsigned int _aqueous_phase_number
 Phase number of the aqueous phase.
 
unsigned int _gas_phase_number
 Phase number of the gas phase.
 
const Real _R
 Universal gas constant (J/mol/K)
 
const Real _T_c2k
 Conversion from C to K.
 
const PorousFlowCapillaryPressure & _pc
 Capillary pressure UserObject.
 
FluidStateProperties _empty_fsp
 Empty FluidStateProperties object.
 
const Moose::CoordinateSystemType & _coord_sys
 
const THREAD_ID _tid
 
SubProblem & _subproblem
 
FEProblemBase & _fe_problem
 
SystemBase & _sys
 
Assembly & _assembly
 
const bool _duplicate_initial_execution
 
std::set< std::string > _depend_uo
 
const bool & _enabled
 
MooseApp & _app
 
Factory & _factory
 
ActionFactory & _action_factory
 
const std::string & _type
 
const std::string & _name
 
const InputParameters & _pars
 
const ExecFlagEnum & _execute_enum
 
const ExecFlagType & _current_execute_flag
 
MooseApp & _restartable_app
 
const std::string _restartable_system_name
 
const THREAD_ID _restartable_tid
 
const bool _restartable_read_only
 
FEProblemBase & _mci_feproblem
 
FEProblemBase & _mdi_feproblem
 
MooseApp & _pg_moose_app
 
const std::string _prefix
 
FEProblemBase & _sc_fe_problem
 
const THREAD_ID _sc_tid
 
const Real & _real_zero
 
const VariableValue & _scalar_zero
 
const Point & _point_zero
 
const InputParameters & _mi_params
 
const std::string _mi_name
 
const MooseObjectName _mi_moose_object_name
 
FEProblemBase & _mi_feproblem
 
SubProblem & _mi_subproblem
 
const THREAD_ID _mi_tid
 
const bool _is_kokkos_object
 
const Moose::MaterialDataType _material_data_type
 
MaterialData & _material_data
 
bool _stateful_allowed
 
bool _get_material_property_called
 
std::vector< std::unique_ptr< PropertyValue > > _default_properties
 
std::unordered_set< unsigned int > _material_property_dependencies
 
const MaterialPropertyName _get_suffix
 
const bool _use_interpolated_state
 
const InputParameters & _ti_params
 
FEProblemBase & _ti_feproblem
 
bool _is_implicit
 
Real & _t
 
const Real & _t_old
 
int & _t_step
 
Real & _dt
 
Real & _dt_old
 
bool _is_transient
 
const Parallel::Communicator & _communicator
 

Static Protected Attributes

static const std::string _interpolated_old
 
static const std::string _interpolated_older
 

Private Member Functions

const Moose::FunctionBase * getKokkosFunctionByNameHelper (const FunctionName &name) const
 
const UserObjectBase & getUserObjectFromFEProblem (const UserObjectName &object_name, const THREAD_ID tid=0) const
 
const T & castUserObject (const UserObjectBase &uo_base, const std::string &param_name="") const
 
void mooseObjectError (const std::string &param_name, std::stringstream &oss) const
 
const std::string & userObjectType (const UserObjectBase &uo) const
 
const std::string & userObjectName (const UserObjectBase &uo) const
 
const PostprocessorName & getPostprocessorNameInternal (const std::string &param_name, const unsigned int index, const bool allow_default_value=true) const
 
bool isDefaultPostprocessorValueByName (const PostprocessorName &name) const
 
PostprocessorValue getDefaultPostprocessorValueByName (const PostprocessorName &name) const
 
void checkParam (const std::string &param_name, const unsigned int index=std::numeric_limits< unsigned int >::max()) const
 
bool postprocessorsAdded () const
 
const VectorPostprocessorValue & getVectorPostprocessorByNameHelper (const VectorPostprocessorName &name, const std::string &vector_name, bool broadcast, std::size_t t_index) const
 
const VectorPostprocessorContext< VectorPostprocessorValue > & getVectorPostprocessorContextByNameHelper (const VectorPostprocessorName &name, const std::string &vector_name) const
 
bool vectorPostprocessorsAdded () const
 
bool reportersAdded () const
 
void possiblyCheckHasReporter (const ReporterName &reporter_name, const std::string &param_name="") const
 
RestartableDataValue & registerRestartableDataOnApp (std::unique_ptr< RestartableDataValue > data, THREAD_ID tid) const
 
void registerRestartableNameWithFilterOnApp (const std::string &name, Moose::RESTARTABLE_FILTER filter)
 
RestartableData< T > & declareRestartableDataHelper (const std::string &data_name, void *context, Args &&... args) const
 
virtual std::string meshPropertyPrefix (const std::string &data_name) const
 
const RestartableDataValue & getMeshPropertyInternal (const std::string &data_name, const std::string &prefix) const
 
void mooseErrorInternal (Args &&... args) const
 
const VariableValue * getDefaultValue (const std::string &var_name) const
 
const ADVariableValue * getADDefaultValue (const std::string &var_name) const
 
void checkVar (const std::string &var_name) const
 
void validateExecutionerType (const std::string &name, const std::string &fn_name) const
 
Moose::Kokkos::Variable kokkosCoupledVectorTagScalarVariable (const std::string &var_name, const std::string &tag_name, unsigned int comp) const
 
Moose::MaterialDataType getMaterialDataType (const std::set< BoundaryID > &boundary_ids) const
 
unsigned int getMaxQps () const
 
void addConsumedPropertyName (const MooseObjectName &obj_name, const std::string &prop_name)
 
const PostprocessorValue & getPostprocessorValueInternal (const std::string &param_name, unsigned int index, std::size_t t_index) const
 
const PostprocessorValue & getPostprocessorValueInternal (const std::string &param_name, unsigned int index, std::size_t t_index) const
 
const PostprocessorValue & getPostprocessorValueByNameInternal (const PostprocessorName &name, std::size_t t_index) const
 
const PostprocessorValue & getPostprocessorValueByNameInternal (const PostprocessorName &name, std::size_t t_index) const
 
void possiblyCheckHasVectorPostprocessor (const std::string &param_name, const std::string &vector_name) const
 
void possiblyCheckHasVectorPostprocessor (const std::string &param_name, const std::string &vector_name) const
 
void possiblyCheckHasVectorPostprocessorByName (const VectorPostprocessorName &name, const std::string &vector_name) const
 
void possiblyCheckHasVectorPostprocessorByName (const VectorPostprocessorName &name, const std::string &vector_name) const
 

Static Private Member Functions

static const hit::Node * getHitNode (const InputParameters &params)
 
static std::string messagePrefix (const InputParameters &params, const bool hit_prefix)
 

Private Attributes

UserObject * _primary_thread_copy
 
std::set< std::string > _supplied_uo
 
const ParallelParamObject & _parent
 
const MooseBase & _si_moose_base
 
const FEProblemBase * _si_problem
 
ExecFlagEnum _empty_execute_enum
 
const MooseObject & _fni_object
 
const InputParameters & _fni_params
 
FEProblemBase & _fni_feproblem
 
const THREAD_ID _fni_tid
 
const MooseObject & _uoi_moose_object
 
const FEProblemBase & _uoi_feproblem
 
const THREAD_ID _uoi_tid
 
const MooseObject & _ppi_moose_object
 
const InputParameters & _ppi_params
 
const FEProblemBase & _ppi_feproblem
 
std::map< PostprocessorName, std::unique_ptr< PostprocessorValue > > _default_values
 
const bool _broadcast_by_default
 
const MooseObject & _vpi_moose_object
 
const FEProblemBase & _vpi_feproblem
 
const THREAD_ID _vpi_tid
 
const InputParameters & _ri_params
 
FEProblemBase & _ri_fe_problem_base
 
const ReporterData & _ri_reporter_data
 
const MooseObject & _ri_moose_object
 
const InputParameters & _dni_params
 
FEProblemBase & _dni_feproblem
 
const MooseObject *const _dni_moose_object_ptr
 
const InputParameters & _si_params
 
FEProblemBase & _si_feproblem
 
THREAD_ID _si_tid
 
const RestartableDataMapName _metaname
 
std::string _restartable_name
 
MooseApp & _meta_data_app
 
const MooseObject *const _meta_data_object
 
const InputParameters & _sc_parameters
 
const std::string & _sc_name
 
const bool _sc_is_implicit
 
std::unordered_map< std::string, std::vector< MooseVariableScalar * > > _coupled_scalar_vars
 
std::unordered_map< std::string, std::unique_ptr< VariableValue > > _default_value
 
std::unordered_map< std::string, std::unique_ptr< ADVariableValue > > _dual_default_value
 
std::vector< MooseVariableScalar * > _coupled_moose_scalar_vars
 
std::unordered_map< std::string, std::vector< MooseVariableFieldBase * > > _sc_coupled_vars
 
std::set< TagID > _sc_coupleable_vector_tags
 
std::set< TagID > _sc_coupleable_matrix_tags
 
const MooseObject & _mi_moose_object
 
const bool _mi_boundary_restricted
 
const std::set< SubdomainID > & _mi_block_ids
 
const std::set< BoundaryID > & _mi_boundary_ids
 
std::vector< std::unique_ptr< OptionalMaterialPropertyProxyBase< MaterialPropertyInterface > > > _optional_property_proxies
 
const std::string _ti_name
 

Detailed Description

Specialized class for brine and CO2 including calculation of mutual solubility of the two fluids using a high-accuracy fugacity-based formulation.

For temperatures 12C <= T <= 99C, the formulation is based on Spycher, Pruess and Ennis-King, CO2-H2O mixtures in the geological sequestration of CO2. I. Assessment and calculation of mutual solubilities from 12 to 100C and up to 600 bar, Geochimica et Cosmochimica Acta, 67, 3015-3031 (2003), and Spycher and Pruess, CO2-H2O mixtures in the geological sequestration of CO2. II. Partitioning in chloride brine at 12-100C and up to 600 bar, Geochimica et Cosmochimica Acta, 69, 3309-3320 (2005).

For temperatures 109C <= T <= 300C, the formulation is based on Spycher and Pruess, A Phase-Partitioning Model for CO2-Brine Mixtures at Elevated Temperatures and Pressures: Application to CO2-Enhanced Geothermal Systems, Transport in Porous Media, 82, 173-196 (2010)

As the two formulations do not coincide at temperatures near 100C, a cubic polynomial is used in the intermediate temperature range 99C < T < 109C to provide a smooth transition from the two formulations in this region.

Notation convention Throughout this class, both mole fractions and mass fractions will be used. The following notation will be used: yk: mole fraction of component k in the gas phase xk: mole fraction of component k in the liquid phase Yk: mass fraction of component k in the gas phase Xk: mass fraction of component k in the liquid phase

Definition at line 47 of file PorousFlowBrineCO2.h.

Constructor & Destructor Documentation

◆ PorousFlowBrineCO2()

PorousFlowBrineCO2::PorousFlowBrineCO2 ( const InputParameters &  parameters)

Definition at line 29 of file PorousFlowBrineCO2.C.

31 _salt_component(getParam<unsigned int>("salt_component")),
32 _brine_fp(getUserObject<BrineFluidProperties>("brine_fp")),
33 _co2_fp(getUserObject<SinglePhaseFluidProperties>("co2_fp")),
35 _invMh2o(1.0 / _Mh2o),
38 _Rbar(_R * 10.0),
39 _Tlower(372.15),
40 _Tupper(382.15),
41 _Zmin(1.0e-4),
43{
44 // Check that the correct FluidProperties UserObjects have been provided
45 if (_co2_fp.fluidName() != "co2")
46 paramError("co2_fp", "A valid CO2 FluidProperties UserObject must be provided");
47
48 if (_brine_fp.fluidName() != "brine")
49 paramError("brine_fp", "A valid Brine FluidProperties UserObject must be provided");
50
51 // Set the number of phases and components, and their indexes
52 _num_phases = 2;
56
57 // Check that _aqueous_phase_number is <= total number of phases
59 paramError("liquid_phase_number",
60 "This value is larger than the possible number of phases ",
62
63 // Check that _aqueous_fluid_component is <= total number of fluid components
65 paramError("liquid_fluid_component",
66 "This value is larger than the possible number of fluid components",
68
69 // Check that the salt component index is not identical to the liquid fluid component
72 "salt_component",
73 "The value provided must be different from the value entered in liquid_fluid_component");
74
75 // Check that _salt_component is <= total number of fluid components
77 paramError("salt_component",
78 "The value provided is larger than the possible number of fluid components",
80
82}
Real molarMassNaCl() const
NaCl molar mass.
Real molarMassH2O() const
H2O molar mass.
virtual std::string fluidName() const override
Fluid name.
const InputParameters & parameters() const
void paramError(const std::string &param, Args... args) const
const Real _Tlower
Temperature below which the Spycher, Pruess & Ennis-King (2003) model is used (K)
const Real _Tupper
Temperature above which the Spycher & Pruess (2010) model is used (K)
const Real _invMh2o
Inverse of molar mass of H2O (mol/kg)
const Real _Rbar
Molar gas constant in bar cm^3 /(K mol)
const Real _Mco2
Molar mass of CO2 (kg/mol)
const Real _Zmin
Minimum Z - below this value all CO2 will be dissolved.
const std::vector< Real > _co2_henry
Henry's coefficeients for CO2.
const BrineFluidProperties & _brine_fp
Fluid properties UserObject for water.
const Real _Mh2o
Molar mass of water (kg/mol)
const unsigned int _salt_component
Salt component index.
const SinglePhaseFluidProperties & _co2_fp
Fluid properties UserObject for the CO2.
const Real _Mnacl
Molar mass of NaCL.
unsigned int _num_components
Number of components.
unsigned int _gas_phase_number
Phase number of the gas phase.
const Real _R
Universal gas constant (J/mol/K)
const unsigned int _aqueous_phase_number
Phase number of the aqueous phase.
FluidStateProperties _empty_fsp
Empty FluidStateProperties object.
unsigned int _num_phases
Number of phases.
Compositional flash routines for miscible multiphase flow classes with multiple fluid components.
unsigned int _gas_fluid_component
Fluid component number of the gas phase.
const unsigned int _aqueous_fluid_component
Fluid component number of the aqueous component.
virtual std::vector< Real > henryCoefficients() const
Henry's law coefficients for dissolution in water.
virtual Real molarMass() const
Molar mass [kg/mol].
e e e e s T T T T T rho v v T e p T T virtual T std::string fluidName() const
Fluid name.
AD data structure to pass calculated thermophysical properties.

Member Function Documentation

◆ activityCoefficient()

ADReal PorousFlowBrineCO2::activityCoefficient ( const ADReal &  pressure,
const ADReal &  temperature,
const ADReal &  Xnacl 
) const

Activity coefficient for CO2 in brine.

From Duan and Sun, An improved model calculating CO2 solubility in pure water and aqueous NaCl solutions from 257 to 533 K and from 0 to 2000 bar, Chem. Geol., 193, 257-271 (2003)

Note: this is not a 'true' activity coefficient, and is instead related to the molality of CO2 in water and brine. Nevertheless, Spycher and Pruess (2005) refer to it as an activity coefficient, so this notation is followed here.

Parameters
pressurephase pressure (Pa)
temperaturephase temperature (K)
Xnaclsalt mass fraction (kg/kg)
Returns
activity coefficient for CO2 in brine

Definition at line 594 of file PorousFlowBrineCO2.C.

597{
598 using std::log, std::exp;
599
600 // Need pressure in bar
601 const ADReal pbar = pressure * 1.0e-5;
602 // Need NaCl molality (mol/kg)
603 const ADReal mnacl = Xnacl / (1.0 - Xnacl) / _Mnacl;
604
605 const ADReal lambda = -0.411370585 + 6.07632013e-4 * temperature + 97.5347708 / temperature -
606 0.0237622469 * pbar / temperature +
607 0.0170656236 * pbar / (630.0 - temperature) +
608 1.41335834e-5 * temperature * log(pbar);
609
610 const ADReal xi = 3.36389723e-4 - 1.9829898e-5 * temperature +
611 2.12220830e-3 * pbar / temperature -
612 5.24873303e-3 * pbar / (630.0 - temperature);
613
614 return exp(2.0 * lambda * mnacl + xi * mnacl * mnacl);
615}
DualNumber< Real, DNDerivativeType, true > ADReal
Point xi
auto exp(const T &)
auto log(const T &)

Referenced by equilibriumMoleFractionsLowTemp().

◆ activityCoefficientCO2()

ADReal PorousFlowBrineCO2::activityCoefficientCO2 ( const ADReal &  temperature,
const ADReal &  xco2 
) const

Activity coefficient of CO2 Eq.

(13) from Spycher & Pruess (2010)

Parameters
temperaturetemperature (K)
xco2mole fraction of CO2 in liquid phase (-)
Returns
activity coefficient

Definition at line 577 of file PorousFlowBrineCO2.C.

578{
579 using std::exp;
580
581 if (temperature.value() <= 373.15)
582 return 1.0;
583 else
584 {
585 const ADReal Tref = temperature - 373.15;
586 const ADReal xh2o = 1.0 - xco2;
587 const ADReal Am = -3.084e-2 * Tref + 1.927e-5 * Tref * Tref;
588
589 return exp(2.0 * Am * xco2 * xh2o * xh2o);
590 }
591}

Referenced by funcABHighTemp().

◆ activityCoefficientH2O()

ADReal PorousFlowBrineCO2::activityCoefficientH2O ( const ADReal &  temperature,
const ADReal &  xco2 
) const

Activity coefficient of H2O Eq.

(12) from Spycher & Pruess (2010)

Parameters
temperaturetemperature (K)
xco2mole fraction of CO2 in liquid phase (-)
Returns
activity coefficient

Definition at line 560 of file PorousFlowBrineCO2.C.

561{
562 using std::exp;
563
564 if (temperature.value() <= 373.15)
565 return 1.0;
566 else
567 {
568 const ADReal Tref = temperature - 373.15;
569 const ADReal xh2o = 1.0 - xco2;
570 const ADReal Am = -3.084e-2 * Tref + 1.927e-5 * Tref * Tref;
571
572 return exp((Am - 2.0 * Am * xh2o) * xco2 * xco2);
573 }
574}

Referenced by funcABHighTemp().

◆ activityCoefficientHighTemp()

ADReal PorousFlowBrineCO2::activityCoefficientHighTemp ( const ADReal &  temperature,
const ADReal &  Xnacl 
) const

Activity coefficient for CO2 in brine used in the elevated temperature formulation.

Eq. (18) from Spycher and Pruess (2010).

Note: unlike activityCoefficient(), no pressure dependence is included in this formulation

Parameters
temperaturephase temperature (K)
Xnaclsalt mass fraction (kg/kg)
Returns
activity coefficient for CO2 in brine

Definition at line 618 of file PorousFlowBrineCO2.C.

620{
621 using std::exp;
622
623 // Need NaCl molality (mol/kg)
624 const ADReal mnacl = Xnacl / (1.0 - Xnacl) / _Mnacl;
625
626 const ADReal T2 = temperature * temperature;
627 const ADReal T3 = temperature * T2;
628
629 const ADReal lambda = 2.217e-4 * temperature + 1.074 / temperature + 2648.0 / T2;
630 const ADReal xi = 1.3e-5 * temperature - 20.12 / temperature + 5259.0 / T2;
631
632 return (1.0 - mnacl / _invMh2o) * exp(2.0 * lambda * mnacl + xi * mnacl * mnacl);
633}

Referenced by funcABHighTemp().

◆ aqueousComponentIndex()

unsigned int PorousFlowFluidStateMultiComponentBase::aqueousComponentIndex ( ) const
inlineinherited

The index of the aqueous fluid component.

Returns
aqueous fluid component number

Definition at line 29 of file PorousFlowFluidStateMultiComponentBase.h.

29{ return _aqueous_fluid_component; };

◆ aqueousPhaseIndex()

unsigned int PorousFlowFluidStateBase::aqueousPhaseIndex ( ) const
inlineinherited

The index of the aqueous phase.

Returns
aqueous phase number

Definition at line 79 of file PorousFlowFluidStateBase.h.

79{ return _aqueous_phase_number; };

◆ checkVariables()

void PorousFlowBrineCO2::checkVariables ( Real  pressure,
Real  temperature 
) const
protectedvirtual

Check the input variables.

Definition at line 1188 of file PorousFlowBrineCO2.C.

1189{
1190 // The calculation of mass fractions is valid from 12C <= T <= 300C, and
1191 // pressure less than 60 MPa
1192 if (temperature < 285.15 || temperature > 573.15)
1193 mooseException(name() + ": temperature " + Moose::stringify(temperature) +
1194 " is outside range 285.15 K <= T <= 573.15 K");
1195
1196 if (pressure > 6.0e7)
1197 mooseException(name() + ": pressure " + Moose::stringify(pressure) +
1198 " must be less than 60 MPa");
1199}
const std::string name
Definition Setup.h:21
std::string stringify(const T &t)

Referenced by thermophysicalProperties(), and totalMassFraction().

◆ clearFluidStateProperties()

void PorousFlowFluidStateBase::clearFluidStateProperties ( std::vector< FluidStateProperties > &  fsp) const
inherited

Clears the contents of the FluidStateProperties data structure.

Parameters
[out]fspFluidStateProperties data structure with all data initialized to 0

Definition at line 33 of file PorousFlowFluidStateBase.C.

34{
35 std::fill(fsp.begin(), fsp.end(), _empty_fsp);
36}

Referenced by thermophysicalProperties(), and PorousFlowWaterNCG::thermophysicalProperties().

◆ enthalpyOfDissolution()

ADReal PorousFlowBrineCO2::enthalpyOfDissolution ( const ADReal &  temperature) const

Enthalpy of dissolution of CO2 in brine calculated using linear fit to model of Duan and Sun, An improved model calculating CO2 solubility in pure water and aqueous NaCl solutions from 273 to 533 K and from 0 to 2000 bar, Chemical geology, 193, 257–271 (2003).

In the region of interest, the more complicated model given in Eq. (8) of Duan and Sun is well approximated by a simple linear fit (R^2 = 0.9997).

Note: as the effect of salt mass fraction is small, it is not included in this function.

Parameters
temperaturefluid temperature (K)
Returns
enthalpy of dissolution (J/kg)

Definition at line 1159 of file PorousFlowBrineCO2.C.

1160{
1161 // Linear fit to model of Duan and Sun (2003) (in kJ/mol)
1162 const ADReal delta_h = -58.3533 + 0.134519 * temperature;
1163
1164 // Convert to J/kg
1165 return delta_h * 1000.0 / _Mco2;
1166}

Referenced by liquidProperties().

◆ enthalpyOfDissolutionGas()

ADReal PorousFlowBrineCO2::enthalpyOfDissolutionGas ( const ADReal &  temperature,
const ADReal &  Xnacl 
) const

Enthalpy of dissolution of gas phase CO2 in brine calculated using Henry's constant From Himmelblau, Partial molal heats and entropies of solution for gases dissolved in water from the freezing to the near critical point, J.

Phys. Chem. 63 (1959). Correction due to salinity from Battistelli et al, A fluid property module for the TOUGH2 simulator for saline brines with non-condensible gas, Proc. Eighteenth Workshop on Geothermal Reservoir Engineering (1993).

Parameters
temperaturefluid temperature (K)
XnaclNaCl mass fraction (kg/kg)
Returns
enthalpy of dissolution (J/kg)

Definition at line 1129 of file PorousFlowBrineCO2.C.

1130{
1131 // Henry's constant
1132 const ADReal Kh = henryConstant(temperature, Xnacl);
1133
1134 ADReal hdis = -_R * temperature * temperature * Kh.derivatives()[_Tidx] / Kh / _Mco2;
1135
1136 // Derivative of enthalpy of dissolution wrt temperature and xnacl requires the second
1137 // derivatives of Henry's constant. For simplicity, approximate these numerically
1138 const Real dT = temperature.value() * 1.0e-8;
1139 const ADReal T2 = temperature + dT;
1140 const ADReal Kh2 = henryConstant(T2, Xnacl);
1141
1142 const Real dhdis_dT =
1143 (-_R * T2 * T2 * Kh2.derivatives()[_Tidx] / Kh2 / _Mco2 - hdis).value() / dT;
1144
1145 const Real dX = Xnacl.value() * 1.0e-8;
1146 const ADReal X2 = Xnacl + dX;
1147 const ADReal Kh3 = henryConstant(temperature, X2);
1148
1149 const Real dhdis_dX =
1150 (-_R * temperature * temperature * Kh3.derivatives()[_Tidx] / Kh3 / _Mco2 - hdis).value() /
1151 dX;
1152
1153 hdis.derivatives() = temperature.derivatives() * dhdis_dT + Xnacl.derivatives() * dhdis_dX;
1154
1155 return hdis;
1156}
ADReal henryConstant(const ADReal &temperature, const ADReal &Xnacl) const
Henry's constant of dissolution of gas phase CO2 in brine.
const unsigned int _Tidx
Index of derivative wrt temperature.
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real

◆ equilibriumConstantCO2()

ADReal PorousFlowBrineCO2::equilibriumConstantCO2 ( const ADReal &  temperature) const

Equilibrium constant for CO2 For temperatures 12C <= T <= 99C, uses Spycher, Pruess and Ennis-King (2003) For temperatures 109C <= T <= 300C, uses Spycher and Pruess (2010) For temperatures 99C < T < 109C, the value is calculated by smoothly interpolating the two formulations.

Parameters
temperaturetemperature (K)
Returns
equilibrium constant for CO2

Definition at line 665 of file PorousFlowBrineCO2.C.

666{
667 using std::pow;
668
669 // Uses temperature in Celsius
670 const ADReal Tc = temperature - _T_c2k;
671 const ADReal Tc2 = Tc * Tc;
672 const ADReal Tc3 = Tc2 * Tc;
673
674 ADReal logK0CO2;
675
676 if (Tc <= 99.0)
677 logK0CO2 = 1.189 + 1.304e-2 * Tc - 5.446e-5 * Tc2;
678
679 else if (Tc > 99.0 && Tc < 109.0)
680 {
681 const ADReal Tint = (Tc - 99.0) / 10.0;
682 const ADReal Tint2 = Tint * Tint;
683 logK0CO2 = 1.9462 + 2.25692e-2 * Tint - 9.49577e-3 * Tint2 - 6.77721e-3 * Tint * Tint2;
684 }
685
686 else // 109 <= Tc <= 300
687 logK0CO2 = 1.668 + 3.992e-3 * Tc - 1.156e-5 * Tc2 + 1.593e-9 * Tc3;
688
689 return pow(10.0, logK0CO2);
690}
ExpressionBuilder::EBTerm pow(const ExpressionBuilder::EBTerm &left, T exponent)
const Real _T_c2k
Conversion from C to K.

Referenced by funcABHighTemp(), and funcABLowTemp().

◆ equilibriumConstantH2O()

ADReal PorousFlowBrineCO2::equilibriumConstantH2O ( const ADReal &  temperature) const

Equilibrium constant for H2O For temperatures 12C <= T <= 99C, uses Spycher, Pruess and Ennis-King (2003) For temperatures 109C <= T <= 300C, uses Spycher and Pruess (2010) For temperatures 99C < T < 109C, the value is calculated by smoothly interpolating the two formulations.

Parameters
temperaturetemperature (K)
Returns
equilibrium constant for H2O

Definition at line 636 of file PorousFlowBrineCO2.C.

637{
638 using std::pow;
639
640 // Uses temperature in Celsius
641 const ADReal Tc = temperature - _T_c2k;
642 const ADReal Tc2 = Tc * Tc;
643 const ADReal Tc3 = Tc2 * Tc;
644 const ADReal Tc4 = Tc3 * Tc;
645
646 ADReal logK0H2O;
647
648 if (Tc <= 99.0)
649 logK0H2O = -2.209 + 3.097e-2 * Tc - 1.098e-4 * Tc2 + 2.048e-7 * Tc3;
650
651 else if (Tc > 99.0 && Tc < 109.0)
652 {
653 const ADReal Tint = (Tc - 99.0) / 10.0;
654 const ADReal Tint2 = Tint * Tint;
655 logK0H2O = -0.0204026 + 0.0152513 * Tint + 0.417565 * Tint2 - 0.278636 * Tint * Tint2;
656 }
657
658 else // 109 <= Tc <= 300
659 logK0H2O = -2.1077 + 2.8127e-2 * Tc - 8.4298e-5 * Tc2 + 1.4969e-7 * Tc3 - 1.1812e-10 * Tc4;
660
661 return pow(10.0, logK0H2O);
662}

Referenced by funcABHighTemp(), and funcABLowTemp().

◆ equilibriumMassFractions()

void PorousFlowBrineCO2::equilibriumMassFractions ( const ADReal &  pressure,
const ADReal &  temperature,
const ADReal &  Xnacl,
ADReal &  Xco2,
ADReal &  Yh2o 
) const

Mass fractions of CO2 in brine and water vapor in CO2 at equilibrium.

Parameters
pressurephase pressure (Pa)
temperaturephase temperature (K)
XnaclNaCl mass fraction (kg/kg)
[out]Xco2mass fraction of CO2 in liquid (kg/kg)
[out]Yh2omass fraction of H2O in gas (kg/kg)

Definition at line 378 of file PorousFlowBrineCO2.C.

383{
384 // Mole fractions at equilibrium
385 ADReal xco2, yh2o;
386 equilibriumMoleFractions(pressure, temperature, Xnacl, xco2, yh2o);
387
388 // The mass fraction of H2O in gas (assume no salt in gas phase) and derivatives
389 // wrt p, T, and X
390 Yh2o = yh2o * _Mh2o / (yh2o * _Mh2o + (1.0 - yh2o) * _Mco2);
391
392 // NaCl molality (mol/kg)
393 const ADReal mnacl = Xnacl / (1.0 - Xnacl) / _Mnacl;
394
395 // The molality of CO2 in 1kg of H2O
396 const ADReal mco2 = xco2 * (2.0 * mnacl + _invMh2o) / (1.0 - xco2);
397 // The mass fraction of CO2 in brine is then
398 const ADReal denominator = (1.0 + mnacl * _Mnacl + mco2 * _Mco2);
399 Xco2 = mco2 * _Mco2 / denominator;
400}
void equilibriumMoleFractions(const ADReal &pressure, const ADReal &temperature, const ADReal &Xnacl, ADReal &xco2, ADReal &yh2o) const
Mole fractions of CO2 in brine and water vapor in CO2 at equilibrium.

Referenced by massFractions(), and totalMassFraction().

◆ equilibriumMoleFractions()

void PorousFlowBrineCO2::equilibriumMoleFractions ( const ADReal &  pressure,
const ADReal &  temperature,
const ADReal &  Xnacl,
ADReal &  xco2,
ADReal &  yh2o 
) const

Mole fractions of CO2 in brine and water vapor in CO2 at equilibrium.

In the low temperature regime (T <= 99C), the mole fractions are calculated directly, while in the elevated temperature regime (T >= 109C), they are calculated iteratively. In the intermediate regime (99C < T < 109C), a cubic polynomial is used to smoothly connect the low and elevated temperature regimes.

Parameters
pressurephase pressure (Pa)
temperaturephase temperature (K)
XnaclNaCl mass fraction (kg/kg)
[out]xco2mole fraction of CO2 in liquid
[out]yh2omole fraction of H2O in gas

Definition at line 693 of file PorousFlowBrineCO2.C.

698{
699 if (temperature.value() <= _Tlower)
700 {
701 equilibriumMoleFractionsLowTemp(pressure, temperature, Xnacl, xco2, yh2o);
702 }
703 else if (temperature.value() > _Tlower && temperature.value() < _Tupper)
704 {
705 // Cubic polynomial in this regime
706 const Real Tint = (temperature.value() - _Tlower) / 10.0;
707
708 // Equilibrium mole fractions and derivatives at the lower temperature
709 ADReal Tlower = _Tlower;
710 Moose::derivInsert(Tlower.derivatives(), _Tidx, 1.0);
711
712 ADReal xco2_lower, yh2o_lower;
713 equilibriumMoleFractionsLowTemp(pressure, Tlower, Xnacl, xco2_lower, yh2o_lower);
714
715 const Real dxco2_dT_lower = xco2_lower.derivatives()[_Tidx];
716 const Real dyh2o_dT_lower = yh2o_lower.derivatives()[_Tidx];
717
718 // Equilibrium mole fractions and derivatives at the upper temperature
719 Real xco2_upper, yh2o_upper;
720 Real co2_density_upper = _co2_fp.rho_from_p_T(pressure.value(), _Tupper);
721
723 pressure.value(), _Tupper, Xnacl.value(), co2_density_upper, xco2_upper, yh2o_upper);
724
725 Real A, dA_dp, dA_dT, B, dB_dp, dB_dT, dB_dX;
726 funcABHighTemp(pressure.value(),
727 _Tupper,
728 Xnacl.value(),
729 co2_density_upper,
730 xco2_upper,
731 yh2o_upper,
732 A,
733 dA_dp,
734 dA_dT,
735 B,
736 dB_dp,
737 dB_dT,
738 dB_dX);
739
740 const Real dyh2o_dT_upper =
741 ((1.0 - B) * dA_dT + (A - 1.0) * A * dB_dT) / (1.0 - A * B) / (1.0 - A * B);
742 const Real dxco2_dT_upper = dB_dT * (1.0 - yh2o_upper) - B * dyh2o_dT_upper;
743
744 // The mole fractions in this regime are then found by interpolation
745 Real xco2r, yh2or, dxco2_dT, dyh2o_dT;
747 Tint, xco2_lower.value(), dxco2_dT_lower, xco2_upper, dxco2_dT_upper, xco2r, dxco2_dT);
749 Tint, yh2o_lower.value(), dyh2o_dT_lower, yh2o_upper, dyh2o_dT_upper, yh2or, dyh2o_dT);
750
751 xco2 = xco2r;
752 Moose::derivInsert(xco2.derivatives(), _pidx, xco2_lower.derivatives()[_pidx]);
753 Moose::derivInsert(xco2.derivatives(), _Tidx, dxco2_dT);
754 Moose::derivInsert(xco2.derivatives(), _Xidx, xco2_lower.derivatives()[_Xidx]);
755
756 yh2o = yh2or;
757 Moose::derivInsert(yh2o.derivatives(), _pidx, yh2o_lower.derivatives()[_pidx]);
758 Moose::derivInsert(yh2o.derivatives(), _Tidx, dyh2o_dT);
759 Moose::derivInsert(yh2o.derivatives(), _Xidx, yh2o_lower.derivatives()[_Xidx]);
760 }
761 else
762 {
763 // CO2 density and derivatives wrt pressure and temperature
764 const Real co2_density = _co2_fp.rho_from_p_T(pressure.value(), temperature.value());
765
766 // Equilibrium mole fractions solved using iteration in this regime
767 Real xco2r, yh2or;
769 pressure.value(), temperature.value(), Xnacl.value(), co2_density, xco2r, yh2or);
770
771 // Can use these in funcABHighTemp() to get derivatives analytically rather than by iteration
772 Real A, dA_dp, dA_dT, B, dB_dp, dB_dT, dB_dX;
773 funcABHighTemp(pressure.value(),
774 temperature.value(),
775 Xnacl.value(),
776 co2_density,
777 xco2r,
778 yh2or,
779 A,
780 dA_dp,
781 dA_dT,
782 B,
783 dB_dp,
784 dB_dT,
785 dB_dX);
786
787 const Real dyh2o_dp =
788 ((1.0 - B) * dA_dp + (A - 1.0) * A * dB_dp) / (1.0 - A * B) / (1.0 - A * B);
789 const Real dxco2_dp = dB_dp * (1.0 - yh2or) - B * dyh2o_dp;
790
791 const Real dyh2o_dT =
792 ((1.0 - B) * dA_dT + (A - 1.0) * A * dB_dT) / (1.0 - A * B) / (1.0 - A * B);
793 const Real dxco2_dT = dB_dT * (1.0 - yh2or) - B * dyh2o_dT;
794
795 const Real dyh2o_dX = ((A - 1.0) * A * dB_dX) / (1.0 - A * B) / (1.0 - A * B);
796 const Real dxco2_dX = dB_dX * (1.0 - yh2or) - B * dyh2o_dX;
797
798 xco2 = xco2r;
799 Moose::derivInsert(xco2.derivatives(), _pidx, dxco2_dp);
800 Moose::derivInsert(xco2.derivatives(), _Tidx, dxco2_dT);
801 Moose::derivInsert(xco2.derivatives(), _Xidx, dxco2_dX);
802
803 yh2o = yh2or;
804 Moose::derivInsert(yh2o.derivatives(), _pidx, dyh2o_dp);
805 Moose::derivInsert(yh2o.derivatives(), _Tidx, dyh2o_dT);
806 Moose::derivInsert(yh2o.derivatives(), _Xidx, dyh2o_dX);
807 }
808}
void solveEquilibriumMoleFractionHighTemp(Real pressure, Real temperature, Real Xnacl, Real co2_density, Real &xco2, Real &yh2o) const
Function to solve for yh2o and xco2 iteratively in the elevated temperature regime (T > 100C)
void smoothCubicInterpolation(Real temperature, Real f0, Real df0, Real f1, Real df1, Real &value, Real &deriv) const
Cubic function to smoothly interpolate between the low temperature and elevated temperature models fo...
void funcABHighTemp(Real pressure, Real temperature, Real Xnacl, Real co2_density, Real xco2, Real yh2o, Real &A, Real &B) const
The function A (Eq.
void equilibriumMoleFractionsLowTemp(const ADReal &pressure, const ADReal &temperature, const ADReal &Xnacl, ADReal &xco2, ADReal &yh2o) const
Mole fractions of CO2 in brine and water vapor in CO2 at equilibrium in the low temperature regime (T...
const unsigned int _Xidx
Index of derivative wrt salt mass fraction X.
const unsigned int _pidx
Index of derivative wrt pressure.
void derivInsert(SemiDynamicSparseNumberArray< Real, libMesh::dof_id_type, NWrapper< N > > &derivs, libMesh::dof_id_type index, Real value)

Referenced by equilibriumMassFractions().

◆ equilibriumMoleFractionsLowTemp()

void PorousFlowBrineCO2::equilibriumMoleFractionsLowTemp ( const ADReal &  pressure,
const ADReal &  temperature,
const ADReal &  Xnacl,
ADReal &  xco2,
ADReal &  yh2o 
) const

Mole fractions of CO2 in brine and water vapor in CO2 at equilibrium in the low temperature regime (T <= 99C).

Parameters
pressurephase pressure (Pa)
temperaturephase temperature (K)
XnaclNaCl mass fraction (kg/kg)
[out]xco2mole fraction of CO2 in liquid
[out]yh2omass fraction of mole in gas

Definition at line 811 of file PorousFlowBrineCO2.C.

816{
817 if (temperature.value() > 373.15)
819 ": equilibriumMoleFractionsLowTemp() is not valid for T > 373.15K. Use "
820 "equilibriumMoleFractions() instead");
821
822 // CO2 density and derivatives wrt pressure and temperature
823 const ADReal co2_density = _co2_fp.rho_from_p_T(pressure, temperature);
824
825 // Assume infinite dilution (yh20 = 0 and xco2 = 0) in low temperature regime
826 ADReal A, B;
827 funcABLowTemp(pressure, temperature, co2_density, A, B);
828
829 // As the activity coefficient for CO2 in brine used in this regime isn't a 'true'
830 // activity coefficient, we instead calculate the molality of CO2 in water, then
831 // correct it for brine, and then calculate the mole fractions.
832 // The mole fraction in pure water is
833 const ADReal yh2ow = (1.0 - B) / (1.0 / A - B);
834 const ADReal xco2w = B * (1.0 - yh2ow);
835
836 // Molality of CO2 in pure water
837 const ADReal mco2w = xco2w * _invMh2o / (1.0 - xco2w);
838 // Molality of CO2 in brine is then calculated using gamma
839 const ADReal gamma = activityCoefficient(pressure, temperature, Xnacl);
840 const ADReal mco2 = mco2w / gamma;
841
842 // Need NaCl molality (mol/kg)
843 const ADReal mnacl = Xnacl / (1.0 - Xnacl) / _Mnacl;
844
845 // Mole fractions of CO2 and H2O in liquid and gas phases
846 const ADReal total_moles = 2.0 * mnacl + _invMh2o + mco2;
847 xco2 = mco2 / total_moles;
848 yh2o = A * (1.0 - xco2 - 2.0 * mnacl / total_moles);
849}
void mooseError(Args &&... args) const
void funcABLowTemp(const ADReal &pressure, const ADReal &temperature, const ADReal &co2_density, ADReal &A, ADReal &B) const
ADReal activityCoefficient(const ADReal &pressure, const ADReal &temperature, const ADReal &Xnacl) const
Activity coefficient for CO2 in brine.

Referenced by equilibriumMoleFractions().

◆ execute()

void PorousFlowFluidStateBase::execute ( )
inlinefinalvirtualinherited

Implements GeneralUserObject.

Definition at line 60 of file PorousFlowFluidStateBase.h.

60{};

◆ finalize()

void PorousFlowFluidStateBase::finalize ( )
inlinefinalvirtualinherited

Implements GeneralUserObject.

Definition at line 61 of file PorousFlowFluidStateBase.h.

61{};

◆ fluidStateName()

std::string PorousFlowBrineCO2::fluidStateName ( ) const
overridevirtual

Name of FluidState.

Implements PorousFlowFluidStateBase.

Definition at line 85 of file PorousFlowBrineCO2.C.

86{
87 return "brine-co2";
88}

◆ fugacityCoefficientCO2HighTemp()

ADReal PorousFlowBrineCO2::fugacityCoefficientCO2HighTemp ( const ADReal &  pressure,
const ADReal &  temperature,
const ADReal &  co2_density,
const ADReal &  xco2,
const ADReal &  yh2o 
) const

Definition at line 512 of file PorousFlowBrineCO2.C.

517{
518 using std::sqrt, std::pow, std::log, std::exp;
519
520 // Need pressure in bar
521 const ADReal pbar = pressure * 1.0e-5;
522 // Molar volume in cm^3/mol
523 const ADReal V = _Mco2 / co2_density * 1.0e6;
524
525 // Redlich-Kwong parameters
526 const ADReal yco2 = 1.0 - yh2o;
527 const ADReal xh2o = 1.0 - xco2;
528
529 const ADReal aCO2 = 8.008e7 - 4.984e4 * temperature;
530 const ADReal aH2O = 1.337e8 - 1.4e4 * temperature;
531 const Real bCO2 = 28.25;
532 const Real bH2O = 15.7;
533 const ADReal KH2OCO2 = 1.427e-2 - 4.037e-4 * temperature;
534 const ADReal KCO2H2O = 0.4228 - 7.422e-4 * temperature;
535 const ADReal kH2OCO2 = KH2OCO2 * yh2o + KCO2H2O * yco2;
536 const ADReal kCO2H2O = KCO2H2O * yh2o + KH2OCO2 * yco2;
537
538 const ADReal aH2OCO2 = sqrt(aCO2 * aH2O) * (1.0 - kH2OCO2);
539 const ADReal aCO2H2O = sqrt(aCO2 * aH2O) * (1.0 - kCO2H2O);
540
541 const ADReal amix = yh2o * yh2o * aH2O + yh2o * yco2 * (aH2OCO2 + aCO2H2O) + yco2 * yco2 * aCO2;
542 const ADReal bmix = yh2o * bH2O + yco2 * bCO2;
543
544 const ADReal t15 = pow(temperature, 1.5);
545
546 ADReal lnPhiCO2 = bCO2 / bmix * (pbar * V / (_Rbar * temperature) - 1.0) -
547 log(pbar * (V - bmix) / (_Rbar * temperature));
548
549 ADReal term3 = (2.0 * yco2 * aCO2 + yh2o * (aH2OCO2 + aCO2H2O) -
550 yh2o * yco2 * sqrt(aH2O * aCO2) * (kH2OCO2 - kCO2H2O) * (yh2o - yco2) +
551 xh2o * xco2 * sqrt(aH2O * aCO2) * (kCO2H2O - kH2OCO2)) /
552 amix;
553
554 lnPhiCO2 += (term3 - bCO2 / bmix) * amix / (bmix * _Rbar * t15) * log(V / (V + bmix));
555
556 return exp(lnPhiCO2);
557}
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template * sqrt(_arg)) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(tanh

Referenced by fugacityCoefficientsHighTemp().

◆ fugacityCoefficientH2OHighTemp()

ADReal PorousFlowBrineCO2::fugacityCoefficientH2OHighTemp ( const ADReal &  pressure,
const ADReal &  temperature,
const ADReal &  co2_density,
const ADReal &  xco2,
const ADReal &  yh2o 
) const

Definition at line 464 of file PorousFlowBrineCO2.C.

469{
470 using std::sqrt, std::pow, std::log, std::exp;
471
472 // Need pressure in bar
473 const ADReal pbar = pressure * 1.0e-5;
474 // Molar volume in cm^3/mol
475 const ADReal V = _Mco2 / co2_density * 1.0e6;
476
477 // Redlich-Kwong parameters
478 const ADReal yco2 = 1.0 - yh2o;
479 const ADReal xh2o = 1.0 - xco2;
480
481 const ADReal aCO2 = 8.008e7 - 4.984e4 * temperature;
482 const ADReal aH2O = 1.337e8 - 1.4e4 * temperature;
483 const Real bCO2 = 28.25;
484 const Real bH2O = 15.7;
485 const ADReal KH2OCO2 = 1.427e-2 - 4.037e-4 * temperature;
486 const ADReal KCO2H2O = 0.4228 - 7.422e-4 * temperature;
487 const ADReal kH2OCO2 = KH2OCO2 * yh2o + KCO2H2O * yco2;
488 const ADReal kCO2H2O = KCO2H2O * yh2o + KH2OCO2 * yco2;
489
490 const ADReal aH2OCO2 = sqrt(aCO2 * aH2O) * (1.0 - kH2OCO2);
491 const ADReal aCO2H2O = sqrt(aCO2 * aH2O) * (1.0 - kCO2H2O);
492
493 const ADReal amix = yh2o * yh2o * aH2O + yh2o * yco2 * (aH2OCO2 + aCO2H2O) + yco2 * yco2 * aCO2;
494 const ADReal bmix = yh2o * bH2O + yco2 * bCO2;
495
496 const ADReal t15 = pow(temperature, 1.5);
497
498 ADReal lnPhiH2O = bH2O / bmix * (pbar * V / (_Rbar * temperature) - 1.0) -
499 log(pbar * (V - bmix) / (_Rbar * temperature));
500 ADReal term3 = (2.0 * yh2o * aH2O + yco2 * (aH2OCO2 + aCO2H2O) -
501 yh2o * yco2 * sqrt(aH2O * aCO2) * (kH2OCO2 - kCO2H2O) * (yh2o - yco2) +
502 xh2o * xco2 * sqrt(aH2O * aCO2) * (kH2OCO2 - kCO2H2O)) /
503 amix;
504 term3 -= bH2O / bmix;
505 term3 *= amix / (bmix * _Rbar * t15) * log(V / (V + bmix));
506 lnPhiH2O += term3;
507
508 return exp(lnPhiH2O);
509}

Referenced by fugacityCoefficientsHighTemp().

◆ fugacityCoefficientsHighTemp()

void PorousFlowBrineCO2::fugacityCoefficientsHighTemp ( const ADReal &  pressure,
const ADReal &  temperature,
const ADReal &  co2_density,
const ADReal &  xco2,
const ADReal &  yh2o,
ADReal &  fco2,
ADReal &  fh2o 
) const

Fugacity coefficients for H2O and CO2 at elevated temperatures (100C < T <= 300C).

Eq. (A8) from Spycher & Pruess (2010)

Parameters
pressuregas pressure (Pa)
temperaturetemperature (K)
co2_densityCO2 density (kg/m^3)
xco2mole fraction of CO2 in liquid phase (-)
yh2omole fraction of H2O in gas phase (-)
[out]fco2fugacity coefficient for CO2
[out]fh2ofugacity coefficient for H2O

Definition at line 446 of file PorousFlowBrineCO2.C.

453{
454 if (temperature.value() <= 373.15)
456 ": fugacityCoefficientsHighTemp() is not valid for T <= 373.15K. Use "
457 "fugacityCoefficientsLowTemp() instead");
458
459 fh2o = fugacityCoefficientH2OHighTemp(pressure, temperature, co2_density, xco2, yh2o);
460 fco2 = fugacityCoefficientCO2HighTemp(pressure, temperature, co2_density, xco2, yh2o);
461}
ADReal fugacityCoefficientCO2HighTemp(const ADReal &pressure, const ADReal &temperature, const ADReal &co2_density, const ADReal &xco2, const ADReal &yh2o) const
ADReal fugacityCoefficientH2OHighTemp(const ADReal &pressure, const ADReal &temperature, const ADReal &co2_density, const ADReal &xco2, const ADReal &yh2o) const

Referenced by funcABHighTemp().

◆ fugacityCoefficientsLowTemp()

void PorousFlowBrineCO2::fugacityCoefficientsLowTemp ( const ADReal &  pressure,
const ADReal &  temperature,
const ADReal &  co2_density,
ADReal &  fco2,
ADReal &  fh2o 
) const

Fugacity coefficients for H2O and CO2 for T <= 100C Eq.

(B7) from Spycher, Pruess and Ennis-King (2003)

Parameters
pressuregas pressure (Pa)
temperaturetemperature (K)
co2_densityCO2 density (kg/m^3)
[out]fco2fugacity coefficient for CO2
[out]fh2ofugacity coefficient for H2O

Definition at line 403 of file PorousFlowBrineCO2.C.

408{
409 using std::log, std::exp, std::pow;
410
411 if (temperature.value() > 373.15)
413 ": fugacityCoefficientsLowTemp() is not valid for T > 373.15K. Use "
414 "fugacityCoefficientsHighTemp() instead");
415
416 // Need pressure in bar
417 const ADReal pbar = pressure * 1.0e-5;
418
419 // Molar volume in cm^3/mol
420 const ADReal V = _Mco2 / co2_density * 1.0e6;
421
422 // Redlich-Kwong parameters
423 const ADReal aCO2 = 7.54e7 - 4.13e4 * temperature;
424 const Real bCO2 = 27.8;
425 const Real aCO2H2O = 7.89e7;
426 const Real bH2O = 18.18;
427
428 const ADReal t15 = pow(temperature, 1.5);
429
430 // The fugacity coefficients for H2O and CO2
431 auto lnPhi = [V, aCO2, bCO2, t15, this](ADReal a, ADReal b)
432 {
433 return log(V / (V - bCO2)) + b / (V - bCO2) -
434 2.0 * a / (_Rbar * t15 * bCO2) * log((V + bCO2) / V) +
435 aCO2 * b / (_Rbar * t15 * bCO2 * bCO2) * (log((V + bCO2) / V) - bCO2 / (V + bCO2));
436 };
437
438 const ADReal lnPhiH2O = lnPhi(aCO2H2O, bH2O) - log(pbar * V / (_Rbar * temperature));
439 const ADReal lnPhiCO2 = lnPhi(aCO2, bCO2) - log(pbar * V / (_Rbar * temperature));
440
441 fh2o = exp(lnPhiH2O);
442 fco2 = exp(lnPhiCO2);
443}

Referenced by funcABLowTemp().

◆ funcABHighTemp() [1/2]

void PorousFlowBrineCO2::funcABHighTemp ( Real  pressure,
Real  temperature,
Real  Xnacl,
Real  co2_density,
Real  xco2,
Real  yh2o,
Real &  A,
Real &  B 
) const
protected

The function A (Eq.

(11) of Spycher, Pruess and Ennis-King (2003) for T <= 100C, and Eqs. (10) and (17) of Spycher and Pruess (2010) for T > 100C)

Parameters
pressuregas pressure (Pa)
temperaturefluid temperature (K)
XnaclNaCl mass fraction (kg/kg)
co2_densityCO2 density (kg/m^3)
xco2mole fraction of CO2 in liquid phase (-)
yh2omole fraction of H2O in gas phase (-)
[out]Athe function A
[out]Bthe function B

Definition at line 888 of file PorousFlowBrineCO2.C.

896{
897 using std::exp;
898
899 if (temperature <= 373.15)
901 ": funcABHighTemp() is not valid for T <= 373.15K. Use funcABLowTemp() instead");
902
903 // Pressure in bar
904 const Real pbar = pressure * 1.0e-5;
905 // Temperature in C
906 const Real Tc = temperature - _T_c2k;
907
908 // Reference pressure and partial molar volumes
909 const Real pref = -1.9906e-1 + 2.0471e-3 * Tc + 1.0152e-4 * Tc * Tc - 1.4234e-6 * Tc * Tc * Tc +
910 1.4168e-8 * Tc * Tc * Tc * Tc;
911 const Real vCO2 = 32.6 + 3.413e-2 * (Tc - 100.0);
912 const Real vH2O = 18.1 + 3.137e-2 * (Tc - 100.0);
913
914 const Real delta_pbar = pbar - pref;
915 const Real Rt = _Rbar * temperature;
916
917 // Equilibrium constants
918 // Use dummy ADReal temperature as derivatives aren't required
919 const ADReal T = temperature;
920 Real K0H2O = equilibriumConstantH2O(T).value();
921 Real K0CO2 = equilibriumConstantCO2(T).value();
922
923 // Fugacity coefficients
924 // Use dummy ADReal variables as derivatives aren't required
925 const ADReal p = pressure;
926 const ADReal rhoco2 = co2_density;
927 const ADReal x = xco2;
928 const ADReal y = yh2o;
929
930 ADReal phiH2O, phiCO2;
931 fugacityCoefficientsHighTemp(p, T, rhoco2, x, y, phiCO2, phiH2O);
932
933 // Activity coefficients
934 const Real gammaH2O = activityCoefficientH2O(T, x).value();
935 const Real gammaCO2 = activityCoefficientCO2(T, x).value();
936
937 // Activity coefficient for CO2 in brine
938 // Use dummy ADReal Xnacl as derivatives aren't required
939 const ADReal X = Xnacl;
940 const Real gamma = activityCoefficientHighTemp(T, X).value();
941
942 A = K0H2O * gammaH2O / (phiH2O.value() * pbar) * exp(delta_pbar * vH2O / Rt);
943 B = phiCO2.value() * pbar / (_invMh2o * K0CO2 * gamma * gammaCO2) * exp(-delta_pbar * vCO2 / Rt);
944}
const std::vector< double > y
const std::vector< double > x
const Real p
const double T
void fugacityCoefficientsHighTemp(const ADReal &pressure, const ADReal &temperature, const ADReal &co2_density, const ADReal &xco2, const ADReal &yh2o, ADReal &fco2, ADReal &fh2o) const
Fugacity coefficients for H2O and CO2 at elevated temperatures (100C < T <= 300C).
ADReal activityCoefficientHighTemp(const ADReal &temperature, const ADReal &Xnacl) const
Activity coefficient for CO2 in brine used in the elevated temperature formulation.
ADReal equilibriumConstantCO2(const ADReal &temperature) const
Equilibrium constant for CO2 For temperatures 12C <= T <= 99C, uses Spycher, Pruess and Ennis-King (2...
ADReal activityCoefficientCO2(const ADReal &temperature, const ADReal &xco2) const
Activity coefficient of CO2 Eq.
ADReal activityCoefficientH2O(const ADReal &temperature, const ADReal &xco2) const
Activity coefficient of H2O Eq.
ADReal equilibriumConstantH2O(const ADReal &temperature) const
Equilibrium constant for H2O For temperatures 12C <= T <= 99C, uses Spycher, Pruess and Ennis-King (2...

Referenced by equilibriumMoleFractions(), funcABHighTemp(), and solveEquilibriumMoleFractionHighTemp().

◆ funcABHighTemp() [2/2]

void PorousFlowBrineCO2::funcABHighTemp ( Real  pressure,
Real  temperature,
Real  Xnacl,
Real  co2_density,
Real  xco2,
Real  yh2o,
Real &  A,
Real &  dA_dp,
Real &  dA_dT,
Real &  B,
Real &  dB_dp,
Real &  dB_dT,
Real &  dB_dX 
) const
protected

Definition at line 947 of file PorousFlowBrineCO2.C.

960{
961 funcABHighTemp(pressure, temperature, Xnacl, co2_density, xco2, yh2o, A, B);
962
963 // Use finite differences for derivatives in the high temperature regime
964 const Real dp = 1.0e-2;
965 const Real dT = 1.0e-6;
966 const Real dX = 1.0e-8;
967
968 Real A2, B2;
969 funcABHighTemp(pressure + dp, temperature, Xnacl, co2_density, xco2, yh2o, A2, B2);
970 dA_dp = (A2 - A) / dp;
971 dB_dp = (B2 - B) / dp;
972
973 funcABHighTemp(pressure, temperature + dT, Xnacl, co2_density, xco2, yh2o, A2, B2);
974 dA_dT = (A2 - A) / dT;
975 dB_dT = (B2 - B) / dT;
976
977 funcABHighTemp(pressure, temperature, Xnacl + dX, co2_density, xco2, yh2o, A2, B2);
978 dB_dX = (B2 - B) / dX;
979}

◆ funcABLowTemp()

void PorousFlowBrineCO2::funcABLowTemp ( const ADReal &  pressure,
const ADReal &  temperature,
const ADReal &  co2_density,
ADReal &  A,
ADReal &  B 
) const
protected

Definition at line 852 of file PorousFlowBrineCO2.C.

857{
858 using std::exp;
859
860 if (temperature.value() > 373.15)
862 ": funcABLowTemp() is not valid for T > 373.15K. Use funcABHighTemp() instead");
863
864 // Pressure in bar
865 const ADReal pbar = pressure * 1.0e-5;
866
867 // Reference pressure and partial molar volumes
868 const Real pref = 1.0;
869 const Real vCO2 = 32.6;
870 const Real vH2O = 18.1;
871
872 const ADReal delta_pbar = pbar - pref;
873 const ADReal Rt = _Rbar * temperature;
874
875 // Equilibrium constants
876 const ADReal K0H2O = equilibriumConstantH2O(temperature);
877 const ADReal K0CO2 = equilibriumConstantCO2(temperature);
878
879 // Fugacity coefficients
880 ADReal phiH2O, phiCO2;
881 fugacityCoefficientsLowTemp(pressure, temperature, co2_density, phiCO2, phiH2O);
882
883 A = K0H2O / (phiH2O * pbar) * exp(delta_pbar * vH2O / Rt);
884 B = phiCO2 * pbar / (_invMh2o * K0CO2) * exp(-delta_pbar * vCO2 / Rt);
885}
void fugacityCoefficientsLowTemp(const ADReal &pressure, const ADReal &temperature, const ADReal &co2_density, ADReal &fco2, ADReal &fh2o) const
Fugacity coefficients for H2O and CO2 for T <= 100C Eq.

Referenced by equilibriumMoleFractionsLowTemp().

◆ gasComponentIndex()

unsigned int PorousFlowFluidStateMultiComponentBase::gasComponentIndex ( ) const
inlineinherited

The index of the gas fluid component.

Returns
gas fluid component number

Definition at line 35 of file PorousFlowFluidStateMultiComponentBase.h.

35{ return _gas_fluid_component; };

◆ gasPhaseIndex()

unsigned int PorousFlowFluidStateBase::gasPhaseIndex ( ) const
inlineinherited

The index of the gas phase.

Returns
gas phase number

Definition at line 85 of file PorousFlowFluidStateBase.h.

85{ return _gas_phase_number; };

◆ gasProperties()

void PorousFlowBrineCO2::gasProperties ( const ADReal &  pressure,
const ADReal &  temperature,
std::vector< FluidStateProperties > &  fsp 
) const

Thermophysical properties of the gaseous state.

Parameters
pressuregas pressure (Pa)
temperaturetemperature (K)
[out]FluidStatePropertiesdata structure

Definition at line 242 of file PorousFlowBrineCO2.C.

245{
247
248 // Gas density, viscosity and enthalpy are approximated with pure CO2 - no correction due
249 // to the small amount of water vapor is made
250 ADReal co2_density, co2_viscosity;
251 _co2_fp.rho_mu_from_p_T(pressure, temperature, co2_density, co2_viscosity);
252
253 // Save the values to the FluidStateProperties object. Note that derivatives wrt z are 0
254 gas.density = co2_density;
255 gas.viscosity = co2_viscosity;
256
257 mooseAssert(gas.density.value() > 0.0, "Gas density must be greater than zero");
258
260 gas.enthalpy = _co2_fp.h_from_p_T(pressure, temperature);
261
263 gas.internal_energy = gas.enthalpy - pressure / gas.density;
264}
const bool _compute_enthalpy
Whether to compute the enthalpy of each phase.
const bool _compute_internal_energy
Whether to compute the internal energy of each phase.
virtual void rho_mu_from_p_T(Real p, Real T, Real &rho, Real &mu) const
Combined methods.

Referenced by thermophysicalProperties(), totalMassFraction(), and twoPhaseProperties().

◆ getPressureIndex()

unsigned int PorousFlowFluidStateMultiComponentBase::getPressureIndex ( ) const
inlineinherited

◆ getTemperatureIndex()

unsigned int PorousFlowFluidStateMultiComponentBase::getTemperatureIndex ( ) const
inlineinherited

◆ getXIndex()

unsigned int PorousFlowFluidStateMultiComponentBase::getXIndex ( ) const
inlineinherited

Definition at line 95 of file PorousFlowFluidStateMultiComponentBase.h.

95{ return _Xidx; };

Referenced by PorousFlowBrineCO2Test::buildObjects().

◆ getZIndex()

unsigned int PorousFlowFluidStateMultiComponentBase::getZIndex ( ) const
inlineinherited

Definition at line 94 of file PorousFlowFluidStateMultiComponentBase.h.

94{ return _Zidx; };
const unsigned int _Zidx
Index of derivative wrt total mass fraction Z.

Referenced by PorousFlowBrineCO2Test::buildObjects(), and PorousFlowWaterNCGTest::buildObjects().

◆ henryConstant()

ADReal PorousFlowBrineCO2::henryConstant ( const ADReal &  temperature,
const ADReal &  Xnacl 
) const

Henry's constant of dissolution of gas phase CO2 in brine.

From Battistelli et al, A fluid property module for the TOUGH2 simulator for saline brines with non-condensible gas, Proc. Eighteenth Workshop on Geothermal Reservoir Engineering (1993)

Parameters
temperaturefluid temperature (K)
XnaclNaCl mass fraction (kg/kg)
Returns
Henry's constant (Pa)

Definition at line 1104 of file PorousFlowBrineCO2.C.

1105{
1106 using std::pow;
1107
1108 // Henry's constant for dissolution in water
1109 const ADReal Kh_h2o = _brine_fp.henryConstant(temperature, _co2_henry);
1110
1111 // The correction to salt is obtained through the salting out coefficient
1112 const std::vector<Real> b{1.19784e-1, -7.17823e-4, 4.93854e-6, -1.03826e-8, 1.08233e-11};
1113
1114 // Need temperature in Celsius
1115 const ADReal Tc = temperature - _T_c2k;
1116
1117 ADReal kb = 0.0;
1118 for (unsigned int i = 0; i < b.size(); ++i)
1119 kb += b[i] * pow(Tc, i);
1120
1121 // Need salt mass fraction in molality
1122 const ADReal xmol = Xnacl / (1.0 - Xnacl) / _Mnacl;
1123
1124 // Henry's constant and its derivative wrt temperature and salt mass fraction
1125 return Kh_h2o * pow(10.0, xmol * kb);
1126}
Real henryConstant(Real temperature, const std::vector< Real > &coeffs) const
IAPWS formulation of Henry's law constant for dissolution in water (implemented in water FluidPropert...

Referenced by enthalpyOfDissolutionGas().

◆ initialize()

void PorousFlowFluidStateBase::initialize ( )
inlinefinalvirtualinherited

Implements GeneralUserObject.

Definition at line 59 of file PorousFlowFluidStateBase.h.

59{};

◆ liquidProperties()

void PorousFlowBrineCO2::liquidProperties ( const ADReal &  pressure,
const ADReal &  temperature,
const ADReal &  Xnacl,
std::vector< FluidStateProperties > &  fsp 
) const

Thermophysical properties of the liquid state.

Parameters
pressureliquid pressure (Pa)
temperaturetemperature (K)
XnaclNaCl mass fraction (kg/kg)
[out]FluidStatePropertiesdata structure

Definition at line 267 of file PorousFlowBrineCO2.C.

271{
273
274 // The liquid density includes the density increase due to dissolved CO2
275 const ADReal brine_density = _brine_fp.rho_from_p_T_X(pressure, temperature, Xnacl);
276
277 // Mass fraction of CO2 in liquid phase
278 const ADReal Xco2 = liquid.mass_fraction[_gas_fluid_component];
279
280 // The liquid density
281 const ADReal co2_partial_density = partialDensityCO2(temperature);
282
283 const ADReal liquid_density = 1.0 / (Xco2 / co2_partial_density + (1.0 - Xco2) / brine_density);
284
285 // Assume that liquid viscosity is just the brine viscosity
286 const ADReal liquid_viscosity = _brine_fp.mu_from_p_T_X(pressure, temperature, Xnacl);
287
288 // Save the values to the FluidStateProperties object
289 liquid.density = liquid_density;
290 liquid.viscosity = liquid_viscosity;
291
292 mooseAssert(liquid.density.value() > 0.0, "Liquid density must be greater than zero");
293
295 {
296 // Liquid enthalpy (including contribution due to the enthalpy of dissolution)
297 const ADReal brine_enthalpy = _brine_fp.h_from_p_T_X(pressure, temperature, Xnacl);
298
299 // Enthalpy of CO2
300 const ADReal co2_enthalpy = _co2_fp.h_from_p_T(pressure, temperature);
301
302 // Enthalpy of dissolution
303 const ADReal hdis = enthalpyOfDissolution(temperature);
304
305 liquid.enthalpy = (1.0 - Xco2) * brine_enthalpy + Xco2 * (co2_enthalpy + hdis);
306 }
307
309 liquid.internal_energy = liquid.enthalpy - pressure / liquid.density;
310}
virtual Real mu_from_p_T_X(Real pressure, Real temperature, Real xnacl) const override
virtual Real rho_from_p_T_X(Real pressure, Real temperature, Real xnacl) const override
FPADReal h_from_p_T_X(const FPADReal &pressure, const FPADReal &temperature, const FPADReal &xnacl) const
ADReal partialDensityCO2(const ADReal &temperature) const
Partial density of dissolved CO2 From Garcia, Density of aqueous solutions of CO2,...
ADReal enthalpyOfDissolution(const ADReal &temperature) const
Enthalpy of dissolution of CO2 in brine calculated using linear fit to model of Duan and Sun,...
std::vector< ADReal > mass_fraction

Referenced by thermophysicalProperties(), totalMassFraction(), and twoPhaseProperties().

◆ massFractions()

void PorousFlowBrineCO2::massFractions ( const ADReal &  pressure,
const ADReal &  temperature,
const ADReal &  Xnacl,
const ADReal &  Z,
FluidStatePhaseEnum &  phase_state,
std::vector< FluidStateProperties > &  fsp 
) const

Mass fractions of CO2 and H2O in both phases, as well as derivatives wrt PorousFlow variables.

Values depend on the phase state (liquid, gas or two phase)

Parameters
pressurephase pressure (Pa)
temperaturephase temperature (K)
XnaclNaCl mass fraction (kg/kg)
Ztotal mass fraction of CO2 component
[out]PhaseStateEnumcurrent phase state
[out]FluidStatePropertiesdata structure

Definition at line 171 of file PorousFlowBrineCO2.C.

177{
180
181 ADReal Xco2 = 0.0;
182 ADReal Yh2o = 0.0;
183 ADReal Yco2 = 0.0;
184
185 // If the amount of CO2 is less than the smallest solubility, then all CO2 will
186 // be dissolved, and the equilibrium mass fractions do not need to be computed
187 if (Z.value() < _Zmin)
188 phase_state = FluidStatePhaseEnum::LIQUID;
189
190 else
191 {
192 // Equilibrium mass fraction of CO2 in liquid and H2O in gas phases
193 equilibriumMassFractions(pressure, temperature, Xnacl, Xco2, Yh2o);
194
195 Yco2 = 1.0 - Yh2o;
196
197 // Determine which phases are present based on the value of z
198 phaseState(Z.value(), Xco2.value(), Yco2.value(), phase_state);
199 }
200
201 // The equilibrium mass fractions calculated above are only correct in the two phase
202 // state. If only liquid or gas phases are present, the mass fractions are given by
203 // the total mass fraction z
204 ADReal Xh2o = 0.0;
205
206 switch (phase_state)
207 {
209 {
210 Xco2 = Z;
211 Yco2 = 0.0;
212 Xh2o = 1.0 - Z;
213 Yh2o = 0.0;
214 break;
215 }
216
218 {
219 Xco2 = 0.0;
220 Yco2 = Z;
221 Yh2o = 1.0 - Z;
222 break;
223 }
224
226 {
227 // Keep equilibrium mass fractions
228 Xh2o = 1.0 - Xco2;
229 break;
230 }
231 }
232
233 // Save the mass fractions in the FluidStateProperties object
235 liquid.mass_fraction[_gas_fluid_component] = Xco2;
236 liquid.mass_fraction[_salt_component] = Xnacl;
239}
void equilibriumMassFractions(const ADReal &pressure, const ADReal &temperature, const ADReal &Xnacl, ADReal &Xco2, ADReal &Yh2o) const
Mass fractions of CO2 in brine and water vapor in CO2 at equilibrium.
void phaseState(Real Zi, Real Xi, Real Yi, FluidStatePhaseEnum &phase_state) const
Determines the phase state gven the total mass fraction and equilibrium mass fractions.

Referenced by thermophysicalProperties().

◆ numComponents()

unsigned int PorousFlowFluidStateBase::numComponents ( ) const
inlineinherited

The maximum number of components in this model.

Returns
number of components

Definition at line 73 of file PorousFlowFluidStateBase.h.

73{ return _num_components; };

◆ numPhases()

unsigned int PorousFlowFluidStateBase::numPhases ( ) const
inlineinherited

The maximum number of phases in this model.

Returns
number of phases

Definition at line 67 of file PorousFlowFluidStateBase.h.

67{ return _num_phases; };

Referenced by PorousFlowFluidStateSingleComponentTempl< is_ad >::PorousFlowFluidStateSingleComponentTempl(), and PorousFlowFluidStateTempl< is_ad >::PorousFlowFluidStateTempl().

◆ partialDensityCO2()

ADReal PorousFlowBrineCO2::partialDensityCO2 ( const ADReal &  temperature) const

Partial density of dissolved CO2 From Garcia, Density of aqueous solutions of CO2, LBNL-49023 (2001)

Parameters
temperaturefluid temperature (K)
Returns
partial molar density (kg/m^3)

Definition at line 1050 of file PorousFlowBrineCO2.C.

1051{
1052 // This correlation uses temperature in C
1053 const ADReal Tc = temperature - _T_c2k;
1054 // The parial molar volume
1055 const ADReal V = 37.51 - 9.585e-2 * Tc + 8.74e-4 * Tc * Tc - 5.044e-7 * Tc * Tc * Tc;
1056
1057 return 1.0e6 * _Mco2 / V;
1058}

Referenced by liquidProperties(), and saturation().

◆ phaseState()

void PorousFlowFluidStateMultiComponentBase::phaseState ( Real  Zi,
Real  Xi,
Real  Yi,
FluidStatePhaseEnum &  phase_state 
) const
inherited

Determines the phase state gven the total mass fraction and equilibrium mass fractions.

Parameters
Zitotal mass fraction
Xiequilibrium mass fraction in liquid
Yiequilibrium mass fraction in gas
[out]phase_statethe phase state (gas, liquid, two phase)

Definition at line 40 of file PorousFlowFluidStateMultiComponentBase.C.

44{
45 if (Zi <= Xi)
46 {
47 // In this case, there is not enough component i to form a gas phase,
48 // so only a liquid phase is present
49 phase_state = FluidStatePhaseEnum::LIQUID;
50 }
51 else if (Zi > Xi && Zi < Yi)
52 {
53 // Two phases are present
55 }
56 else // (Zi >= Yi)
57 {
58 // In this case, there is not enough water to form a liquid
59 // phase, so only a gas phase is present
60 phase_state = FluidStatePhaseEnum::GAS;
61 }
62}

Referenced by massFractions(), and PorousFlowWaterNCG::massFractions().

◆ rachfordRice()

Real PorousFlowFluidStateFlash::rachfordRice ( Real  vf,
std::vector< Real > &  Zi,
std::vector< Real > &  Ki 
) const
inherited

Rachford-Rice equation for vapor fraction.

Can be solved analytically for two components in two phases, but must be solved iteratively using a root finding algorithm for more components. This equation has the nice property that it is monotonic in the interval [0,1], so that only a small number of iterations are typically required to find the root.

The Rachford-Rice equation can also be used to check whether the phase state is two phase, single phase gas, or single phase liquid. Evaluate f(v), the Rachford-Rice equation evaluated at the vapor mass fraction.

If f(0) < 0, then the mixture is below the bubble point, and only a single phase liquid can exist

If f(1) > 0, then the mixture is above the dew point, and only a single phase gas exists.

If f(0) >= 0 and f(1) <= 0, the mixture is between the bubble and dew points, and both gas and liquid phases exist.

Parameters
vfvapor fraction
Zimass fractions
Kiequilibrium constants
Returns
f(x)

Definition at line 26 of file PorousFlowFluidStateFlash.C.

29{
30 const std::size_t num_z = Zi.size();
31 // Check that the sizes of the mass fractions and equilibrium constant vectors are correct
32 if (Ki.size() != num_z + 1)
33 mooseError("The number of mass fractions or equilibrium components passed to rachfordRice is "
34 "not correct");
35
36 Real f = 0.0;
37 Real Z_total = 0.0;
38
39 for (std::size_t i = 0; i < num_z; ++i)
40 {
41 f += Zi[i] * (Ki[i] - 1.0) / (1.0 + x * (Ki[i] - 1.0));
42 Z_total += Zi[i];
43 }
44
45 // Add the last component (with total mass fraction = 1 - z_total)
46 f += (1.0 - Z_total) * (Ki[num_z] - 1.0) / (1.0 + x * (Ki[num_z] - 1.0));
47
48 return f;
49}
Real f(Real x)
Test function for Brents method.

Referenced by PorousFlowFluidStateFlash::vaporMassFraction().

◆ rachfordRiceDeriv()

Real PorousFlowFluidStateFlash::rachfordRiceDeriv ( Real  vf,
std::vector< Real > &  Zi,
std::vector< Real > &  Ki 
) const
inherited

Derivative of Rachford-Rice equation wrt vapor fraction.

Has the nice property that it is strictly negative in the interval [0,1]

Parameters
vfvapor fraction
Zimass fractions
Kiequilibrium constants
Returns
f'(x)

Definition at line 52 of file PorousFlowFluidStateFlash.C.

55{
56 const std::size_t num_Z = Zi.size();
57 // Check that the sizes of the mass fractions and equilibrium constant vectors are correct
58 if (Ki.size() != num_Z + 1)
59 mooseError("The number of mass fractions or equilibrium components passed to rachfordRice is "
60 "not correct");
61
62 Real df = 0.0;
63 Real Z_total = 0.0;
64
65 for (std::size_t i = 0; i < num_Z; ++i)
66 {
67 df -= Zi[i] * (Ki[i] - 1.0) * (Ki[i] - 1.0) / (1.0 + x * (Ki[i] - 1.0)) /
68 (1.0 + x * (Ki[i] - 1.0));
69 Z_total += Zi[i];
70 }
71
72 // Add the last component (with total mass fraction = 1 - z_total)
73 df -= (1.0 - Z_total) * (Ki[num_Z] - 1.0) * (Ki[num_Z] - 1.0) / (1.0 + x * (Ki[num_Z] - 1.0)) /
74 (1.0 + x * (Ki[num_Z] - 1.0));
75
76 return df;
77}

Referenced by PorousFlowFluidStateFlash::vaporMassFraction().

◆ saltComponentIndex()

unsigned int PorousFlowBrineCO2::saltComponentIndex ( ) const
inline

The index of the salt component.

Returns
salt component number

Definition at line 321 of file PorousFlowBrineCO2.h.

321{ return _salt_component; };

◆ saturation()

ADReal PorousFlowBrineCO2::saturation ( const ADReal &  pressure,
const ADReal &  temperature,
const ADReal &  Xnacl,
const ADReal &  Z,
std::vector< FluidStateProperties > &  fsp 
) const

Gas saturation in the two-phase region.

Parameters
pressuregas pressure (Pa)
temperaturephase temperature (K)
XnaclNaCl mass fraction (kg/kg)
Ztotal mass fraction of CO2 component
FluidStatePropertiesdata structure
Returns
gas saturation (-)

Definition at line 313 of file PorousFlowBrineCO2.C.

318{
319 auto & gas = fsp[_gas_phase_number];
320 auto & liquid = fsp[_aqueous_phase_number];
321
322 // Approximate liquid density as saturation isn't known yet, by using the gas
323 // pressure rather than the liquid pressure. This does result in a small error
324 // in the calculated saturation, but this is below the error associated with
325 // the correlations. A more accurate saturation could be found iteraviely,
326 // at the cost of increased computational expense
327
328 // Gas density
329 const ADReal gas_density = _co2_fp.rho_from_p_T(pressure, temperature);
330
331 // Approximate liquid density as saturation isn't known yet
332 const ADReal brine_density = _brine_fp.rho_from_p_T_X(pressure, temperature, Xnacl);
333
334 // Mass fraction of CO2 in liquid phase
335 const ADReal Xco2 = liquid.mass_fraction[_gas_fluid_component];
336
337 // The liquid density
338 const ADReal co2_partial_density = partialDensityCO2(temperature);
339
340 const ADReal liquid_density = 1.0 / (Xco2 / co2_partial_density + (1.0 - Xco2) / brine_density);
341
342 const ADReal Yco2 = gas.mass_fraction[_gas_fluid_component];
343
344 // Set mass equilibrium constants used in the calculation of vapor mass fraction
345 const ADReal K0 = Yco2 / Xco2;
346 const ADReal K1 = (1.0 - Yco2) / (1.0 - Xco2);
347 const ADReal vapor_mass_fraction = vaporMassFraction(Z, K0, K1);
348
349 // The gas saturation in the two phase case
350 const ADReal saturation = vapor_mass_fraction * liquid_density /
351 (gas_density + vapor_mass_fraction * (liquid_density - gas_density));
352
353 return saturation;
354}
ADReal saturation(const ADReal &pressure, const ADReal &temperature, const ADReal &Xnacl, const ADReal &Z, std::vector< FluidStateProperties > &fsp) const
Gas saturation in the two-phase region.
Real vaporMassFraction(Real Z0, Real K0, Real K1) const
Solves Rachford-Rice equation to provide vapor mass fraction.

Referenced by saturation(), totalMassFraction(), and twoPhaseProperties().

◆ smoothCubicInterpolation()

void PorousFlowBrineCO2::smoothCubicInterpolation ( Real  temperature,
Real  f0,
Real  df0,
Real  f1,
Real  df1,
Real &  value,
Real &  deriv 
) const
protected

Cubic function to smoothly interpolate between the low temperature and elevated temperature models for 99C < T < 109C.

Parameters
temperaturetemperature (K)
f0function value at T = 372K (99C)
df0derivative of function at T = 372K (99C)
f1function value at T = 382K (109C)
df1derivative of function at T = 382K (109C)
[out]valuevalue at the given temperature
[out]derivderivative at the given temperature

Definition at line 1169 of file PorousFlowBrineCO2.C.

1171{
1172 // Coefficients of cubic polynomial
1173 const Real dT = _Tupper - _Tlower;
1174
1175 const Real a = f0;
1176 const Real b = df0 * dT;
1177 const Real c = 3.0 * (f1 - f0) - (2.0 * df0 + df1) * dT;
1178 const Real d = 2.0 * (f0 - f1) + (df0 + df1) * dT;
1179
1180 const Real t2 = temperature * temperature;
1181 const Real t3 = temperature * t2;
1182
1183 value = a + b * temperature + c * t2 + d * t3;
1184 deriv = b + 2.0 * c * temperature + 3.0 * d * t2;
1185}
Real deriv(unsigned n, unsigned alpha, unsigned beta, Real x)

Referenced by equilibriumMoleFractions().

◆ solveEquilibriumMoleFractionHighTemp()

void PorousFlowBrineCO2::solveEquilibriumMoleFractionHighTemp ( Real  pressure,
Real  temperature,
Real  Xnacl,
Real  co2_density,
Real &  xco2,
Real &  yh2o 
) const

Function to solve for yh2o and xco2 iteratively in the elevated temperature regime (T > 100C)

Parameters
pressuregas pressure (Pa)
temperaturefluid temperature (K)
XnaclNaCl mass fraction (kg/kg)
co2_densityCO2 density (kg/m^3)
[out]xco2mole fraction of CO2 in liquid phase (-)
[out]yh2omole fraction of H2O in gas phase (-)

Definition at line 982 of file PorousFlowBrineCO2.C.

984{
985 // Initial guess for yh2o and xco2 (from Spycher and Pruess (2010))
986 Real y = _brine_fp.vaporPressure(temperature, 0.0) / pressure;
987 Real x = 0.009;
988
989 // Need salt mass fraction in molality
990 const Real mnacl = Xnacl / (1.0 - Xnacl) / _Mnacl;
991
992 // If y > 1, then just use y = 1, x = 0 (only a gas phase)
993 if (y >= 1.0)
994 {
995 y = 1.0;
996 x = 0.0;
997 }
998 else
999 {
1000 // Residual function for Newton-Raphson
1001 auto fy = [mnacl, this](Real y, Real A, Real B)
1002 {
1003 return y -
1004 (1.0 - B) * _invMh2o / ((1.0 / A - B) * (2.0 * mnacl + _invMh2o) + 2.0 * mnacl * B);
1005 };
1006
1007 // Derivative of fy wrt y
1008 auto dfy = [mnacl, this](Real A, Real B, Real dA, Real dB)
1009 {
1010 const Real denominator = (1.0 / A - B) * (2.0 * mnacl + _invMh2o) + 2.0 * mnacl * B;
1011 return 1.0 + _invMh2o * dB / denominator +
1012 (1.0 - B) * _invMh2o *
1013 (2.0 * mnacl * dB - (2.0 * mnacl + _invMh2o) * (dB + dA / A / A)) / denominator /
1014 denominator;
1015 };
1016
1017 Real A, B;
1018 Real dA, dB;
1019 const Real dy = 1.0e-8;
1020
1021 // Solve for yh2o using Newton-Raphson method
1022 unsigned int iter = 0;
1023 const Real tol = 1.0e-12;
1024 const unsigned int max_its = 10;
1025 funcABHighTemp(pressure, temperature, Xnacl, co2_density, x, y, A, B);
1026
1027 while (std::abs(fy(y, A, B)) > tol)
1028 {
1029 funcABHighTemp(pressure, temperature, Xnacl, co2_density, x, y, A, B);
1030 // Finite difference derivatives of A and B wrt y
1031 funcABHighTemp(pressure, temperature, Xnacl, co2_density, x, y + dy, dA, dB);
1032 dA = (dA - A) / dy;
1033 dB = (dB - B) / dy;
1034
1035 y = y - fy(y, A, B) / dfy(A, B, dA, dB);
1036
1037 x = B * (1.0 - y);
1038
1039 // Break if not converged and just use the value
1040 if (iter > max_its)
1041 break;
1042 }
1043 }
1044
1045 yh2o = y;
1046 xco2 = x;
1047}
const double tol
Real vaporPressure(Real temperature, Real xnacl) const
Brine vapour pressure From Haas, Physical properties of the coexisting phases and thermochemical prop...

Referenced by equilibriumMoleFractions().

◆ thermophysicalProperties() [1/2]

void PorousFlowBrineCO2::thermophysicalProperties ( const ADReal &  pressure,
const ADReal &  temperature,
const ADReal &  Xnacl,
const ADReal &  Z,
unsigned int  qp,
std::vector< FluidStateProperties > &  fsp 
) const
overridevirtual

Implements PorousFlowFluidStateMultiComponentBase.

Definition at line 112 of file PorousFlowBrineCO2.C.

118{
121
122 // Check whether the input temperature is within the region of validity
123 checkVariables(pressure.value(), temperature.value());
124
125 // Clear all of the FluidStateProperties data
127
128 FluidStatePhaseEnum phase_state;
129 massFractions(pressure, temperature, Xnacl, Z, phase_state, fsp);
130
131 switch (phase_state)
132 {
134 {
135 // Set the gas saturations
136 gas.saturation = 1.0;
137
138 // Calculate gas properties
139 gasProperties(pressure, temperature, fsp);
140
141 break;
142 }
143
145 {
146 // Calculate the liquid properties
147 const ADReal liquid_pressure = pressure - _pc.capillaryPressure(1.0, qp);
148 liquidProperties(liquid_pressure, temperature, Xnacl, fsp);
149
150 break;
151 }
152
154 {
155 // Calculate the gas and liquid properties in the two phase region
156 twoPhaseProperties(pressure, temperature, Xnacl, Z, qp, fsp);
157
158 break;
159 }
160 }
161
162 // Liquid saturations can now be set
163 liquid.saturation = 1.0 - gas.saturation;
164
165 // Save pressures to FluidStateProperties object
166 gas.pressure = pressure;
167 liquid.pressure = pressure - _pc.capillaryPressure(liquid.saturation, qp);
168}
FluidStatePhaseEnum
Phase state enum.
void liquidProperties(const ADReal &pressure, const ADReal &temperature, const ADReal &Xnacl, std::vector< FluidStateProperties > &fsp) const
Thermophysical properties of the liquid state.
void gasProperties(const ADReal &pressure, const ADReal &temperature, std::vector< FluidStateProperties > &fsp) const
Thermophysical properties of the gaseous state.
virtual void checkVariables(Real pressure, Real temperature) const
Check the input variables.
void massFractions(const ADReal &pressure, const ADReal &temperature, const ADReal &Xnacl, const ADReal &Z, FluidStatePhaseEnum &phase_state, std::vector< FluidStateProperties > &fsp) const
Mass fractions of CO2 and H2O in both phases, as well as derivatives wrt PorousFlow variables.
void twoPhaseProperties(const ADReal &pressure, const ADReal &temperature, const ADReal &Xnacl, const ADReal &Z, unsigned int qp, std::vector< FluidStateProperties > &fsp) const
Gas and liquid properties in the two-phase region.
virtual Real capillaryPressure(Real saturation, unsigned qp=0) const
Capillary pressure is calculated as a function of true saturation.
const PorousFlowCapillaryPressure & _pc
Capillary pressure UserObject.
void clearFluidStateProperties(std::vector< FluidStateProperties > &fsp) const
Clears the contents of the FluidStateProperties data structure.

◆ thermophysicalProperties() [2/2]

void PorousFlowBrineCO2::thermophysicalProperties ( Real  pressure,
Real  temperature,
Real  Xnacl,
Real  Z,
unsigned int  qp,
std::vector< FluidStateProperties > &  fsp 
) const
overridevirtual

Determines the complete thermophysical state of the system for a given set of primary variables.

Parameters
pressuregas phase pressure (Pa)
temperaturefluid temperature (K)
Xnaclmass fraction of NaCl
Ztotal mass fraction of fluid component
qpquadpoint index
[out]fspthe FluidStateProperties struct containing all properties

Implements PorousFlowFluidStateMultiComponentBase.

Definition at line 91 of file PorousFlowBrineCO2.C.

97{
98 // Make AD versions of primary variables then call AD thermophysicalProperties()
99 ADReal p = pressure;
100 Moose::derivInsert(p.derivatives(), _pidx, 1.0);
101 ADReal T = temperature;
102 Moose::derivInsert(T.derivatives(), _Tidx, 1.0);
103 ADReal Zco2 = Z;
104 Moose::derivInsert(Zco2.derivatives(), _Zidx, 1.0);
105 ADReal X = Xnacl;
106 Moose::derivInsert(X.derivatives(), _Xidx, 1.0);
107
108 thermophysicalProperties(p, T, X, Zco2, qp, fsp);
109}
void thermophysicalProperties(Real pressure, Real temperature, Real Xnacl, Real Z, unsigned int qp, std::vector< FluidStateProperties > &fsp) const override
Determines the complete thermophysical state of the system for a given set of primary variables.

Referenced by thermophysicalProperties().

◆ totalMassFraction()

Real PorousFlowBrineCO2::totalMassFraction ( Real  pressure,
Real  temperature,
Real  Xnacl,
Real  saturation,
unsigned int  qp 
) const
overridevirtual

Total mass fraction of fluid component summed over all phases in the two-phase state for a specified gas saturation.

Parameters
pressuregas pressure (Pa)
temperaturetemperature (K)
XnaclNaCl mass fraction (kg/kg)
saturationgas saturation (-)
qpquadpoint index
Returns
total mass fraction Z (-)

Implements PorousFlowFluidStateMultiComponentBase.

Definition at line 1061 of file PorousFlowBrineCO2.C.

1063{
1064 // Check whether the input pressure and temperature are within the region of validity
1065 checkVariables(pressure, temperature);
1066
1067 // As we do not require derivatives, we can simply ignore their initialisation
1068 const ADReal p = pressure;
1069 const ADReal T = temperature;
1070 const ADReal X = Xnacl;
1071
1072 // FluidStateProperties data structure
1073 std::vector<FluidStateProperties> fsp(_num_phases, FluidStateProperties(_num_components));
1076
1077 // Calculate equilibrium mass fractions in the two-phase state
1078 ADReal Xco2, Yh2o;
1079 equilibriumMassFractions(p, T, X, Xco2, Yh2o);
1080
1081 // Save the mass fractions in the FluidStateMassFractions object
1082 const ADReal Yco2 = 1.0 - Yh2o;
1083 liquid.mass_fraction[_aqueous_fluid_component] = 1.0 - Xco2;
1084 liquid.mass_fraction[_gas_fluid_component] = Xco2;
1087
1088 // Gas properties
1089 gasProperties(pressure, temperature, fsp);
1090
1091 // Liquid properties
1092 const ADReal liquid_saturation = 1.0 - saturation;
1093 const ADReal liquid_pressure = p - _pc.capillaryPressure(liquid_saturation, qp);
1094 liquidProperties(liquid_pressure, T, X, fsp);
1095
1096 // The total mass fraction of ncg (z) can now be calculated
1097 const ADReal Z = (saturation * gas.density * Yco2 + liquid_saturation * liquid.density * Xco2) /
1098 (saturation * gas.density + liquid_saturation * liquid.density);
1099
1100 return Z.value();
1101}

◆ twoPhaseProperties()

void PorousFlowBrineCO2::twoPhaseProperties ( const ADReal &  pressure,
const ADReal &  temperature,
const ADReal &  Xnacl,
const ADReal &  Z,
unsigned int  qp,
std::vector< FluidStateProperties > &  fsp 
) const

Gas and liquid properties in the two-phase region.

Parameters
pressuregas pressure (Pa)
temperaturephase temperature (K)
XnaclNaCl mass fraction (kg/kg)
Ztotal mass fraction of NCG component
qpquadpoint for capillary presssure
[out]FluidStatePropertiesdata structure

Definition at line 357 of file PorousFlowBrineCO2.C.

363{
364 auto & gas = fsp[_gas_phase_number];
365
366 // Calculate all of the gas phase properties, as these don't depend on saturation
367 gasProperties(pressure, temperature, fsp);
368
369 // The gas saturation in the two phase case
370 gas.saturation = saturation(pressure, temperature, Xnacl, Z, fsp);
371
372 // The liquid pressure and properties can now be calculated
373 const ADReal liquid_pressure = pressure - _pc.capillaryPressure(1.0 - gas.saturation, qp);
374 liquidProperties(liquid_pressure, temperature, Xnacl, fsp);
375}

Referenced by thermophysicalProperties().

◆ validParams()

InputParameters PorousFlowBrineCO2::validParams ( )
static

Definition at line 19 of file PorousFlowBrineCO2.C.

20{
22 params.addRequiredParam<UserObjectName>("brine_fp", "The name of the user object for brine");
23 params.addRequiredParam<UserObjectName>("co2_fp", "The name of the user object for CO2");
24 params.addParam<unsigned int>("salt_component", 2, "The component number of salt");
25 params.addClassDescription("Fluid state class for brine and CO2");
26 return params;
27}
void addRequiredParam(const std::string &name, const std::string &doc_string)
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)

◆ vaporMassFraction() [1/3]

ADReal PorousFlowFluidStateFlash::vaporMassFraction ( const ADReal &  Z0,
const ADReal &  K0,
const ADReal &  K1 
) const
inherited

Definition at line 86 of file PorousFlowFluidStateFlash.C.

89{
90 return (Z0 * (K1 - K0) - (K1 - 1.0)) / ((K0 - 1.0) * (K1 - 1.0));
91}

◆ vaporMassFraction() [2/3]

Real PorousFlowFluidStateFlash::vaporMassFraction ( Real  Z0,
Real  K0,
Real  K1 
) const
inherited

Solves Rachford-Rice equation to provide vapor mass fraction.

For two components, the analytical solution is used, while for cases with more than two components, a Newton-Raphson iterative solution is calculated.

Parameters
Zitotal mass fraction(s)
Kiequilibrium constant(s)
Returns
vapor mass fraction

Definition at line 80 of file PorousFlowFluidStateFlash.C.

81{
82 return (Z0 * (K1 - K0) - (K1 - 1.0)) / ((K0 - 1.0) * (K1 - 1.0));
83}

Referenced by saturation(), PorousFlowWaterNCG::saturation(), and PorousFlowFluidStateFlash::vaporMassFraction().

◆ vaporMassFraction() [3/3]

Real PorousFlowFluidStateFlash::vaporMassFraction ( std::vector< Real > &  Zi,
std::vector< Real > &  Ki 
) const
inherited

Definition at line 94 of file PorousFlowFluidStateFlash.C.

95{
96 // Check that the sizes of the mass fractions and equilibrium constant vectors are correct
97 if (Ki.size() != Zi.size() + 1)
98 mooseError("The number of mass fractions or equilibrium components passed to rachfordRice is "
99 "not correct");
100 Real v;
101
102 // If there are only two components, an analytical solution is possible
103 if (Ki.size() == 2)
104 v = vaporMassFraction(Zi[0], Ki[0], Ki[1]);
105 else
106 {
107 // More than two components - solve the Rachford-Rice equation using
108 // Newton-Raphson method
109 // Initial guess for vapor mass fraction
110 Real v0 = 0.5;
111 unsigned int iter = 0;
112
113 while (std::abs(rachfordRice(v0, Zi, Ki)) > _nr_tol)
114 {
115 v0 = v0 - rachfordRice(v0, Zi, Ki) / rachfordRiceDeriv(v0, Zi, Ki);
116 iter++;
117
118 if (iter > _nr_max_its)
119 break;
120 }
121 v = v0;
122 }
123 return v;
124}
const double v
Real rachfordRice(Real vf, std::vector< Real > &Zi, std::vector< Real > &Ki) const
Rachford-Rice equation for vapor fraction.
Real rachfordRiceDeriv(Real vf, std::vector< Real > &Zi, std::vector< Real > &Ki) const
Derivative of Rachford-Rice equation wrt vapor fraction.
const Real _nr_max_its
Maximum number of iterations for the Newton-Raphson routine.
const Real _nr_tol
Tolerance for Newton-Raphson iterations.

Member Data Documentation

◆ _aqueous_fluid_component

const unsigned int PorousFlowFluidStateMultiComponentBase::_aqueous_fluid_component
protectedinherited

◆ _aqueous_phase_number

const unsigned int PorousFlowFluidStateBase::_aqueous_phase_number
protectedinherited

◆ _brine_fp

const BrineFluidProperties& PorousFlowBrineCO2::_brine_fp
protected

◆ _co2_fp

const SinglePhaseFluidProperties& PorousFlowBrineCO2::_co2_fp
protected

◆ _co2_henry

const std::vector<Real> PorousFlowBrineCO2::_co2_henry
protected

Henry's coefficeients for CO2.

Definition at line 483 of file PorousFlowBrineCO2.h.

Referenced by henryConstant().

◆ _compute_enthalpy

const bool PorousFlowFluidStateMultiComponentBase::_compute_enthalpy
protectedinherited

Whether to compute the enthalpy of each phase.

Definition at line 107 of file PorousFlowFluidStateMultiComponentBase.h.

Referenced by gasProperties(), PorousFlowWaterNCG::gasProperties(), liquidProperties(), and PorousFlowWaterNCG::liquidProperties().

◆ _compute_internal_energy

const bool PorousFlowFluidStateMultiComponentBase::_compute_internal_energy
protectedinherited

Whether to compute the internal energy of each phase.

Definition at line 105 of file PorousFlowFluidStateMultiComponentBase.h.

Referenced by gasProperties(), PorousFlowWaterNCG::gasProperties(), liquidProperties(), and PorousFlowWaterNCG::liquidProperties().

◆ _empty_fsp

FluidStateProperties PorousFlowFluidStateBase::_empty_fsp
protectedinherited

◆ _gas_fluid_component

unsigned int PorousFlowFluidStateMultiComponentBase::_gas_fluid_component
protectedinherited

◆ _gas_phase_number

unsigned int PorousFlowFluidStateBase::_gas_phase_number
protectedinherited

◆ _invMh2o

const Real PorousFlowBrineCO2::_invMh2o
protected

◆ _Mco2

const Real PorousFlowBrineCO2::_Mco2
protected

◆ _Mh2o

const Real PorousFlowBrineCO2::_Mh2o
protected

Molar mass of water (kg/mol)

Definition at line 466 of file PorousFlowBrineCO2.h.

Referenced by equilibriumMassFractions().

◆ _Mnacl

const Real PorousFlowBrineCO2::_Mnacl
protected

◆ _nr_max_its

const Real PorousFlowFluidStateFlash::_nr_max_its
protectedinherited

Maximum number of iterations for the Newton-Raphson routine.

Definition at line 77 of file PorousFlowFluidStateFlash.h.

Referenced by PorousFlowFluidStateFlash::vaporMassFraction().

◆ _nr_tol

const Real PorousFlowFluidStateFlash::_nr_tol
protectedinherited

Tolerance for Newton-Raphson iterations.

Definition at line 79 of file PorousFlowFluidStateFlash.h.

Referenced by PorousFlowFluidStateFlash::vaporMassFraction().

◆ _num_components

unsigned int PorousFlowFluidStateBase::_num_components
protectedinherited

◆ _num_phases

unsigned int PorousFlowFluidStateBase::_num_phases
protectedinherited

◆ _pc

const PorousFlowCapillaryPressure& PorousFlowFluidStateBase::_pc
protectedinherited

◆ _pidx

const unsigned int PorousFlowFluidStateMultiComponentBase::_pidx
protectedinherited

◆ _R

const Real PorousFlowFluidStateBase::_R
protectedinherited

Universal gas constant (J/mol/K)

Definition at line 108 of file PorousFlowFluidStateBase.h.

Referenced by PorousFlowWaterNCG::enthalpyOfDissolution(), and enthalpyOfDissolutionGas().

◆ _Rbar

const Real PorousFlowBrineCO2::_Rbar
protected

Molar gas constant in bar cm^3 /(K mol)

Definition at line 474 of file PorousFlowBrineCO2.h.

Referenced by fugacityCoefficientCO2HighTemp(), fugacityCoefficientH2OHighTemp(), fugacityCoefficientsLowTemp(), funcABHighTemp(), and funcABLowTemp().

◆ _salt_component

const unsigned int PorousFlowBrineCO2::_salt_component
protected

Salt component index.

Definition at line 460 of file PorousFlowBrineCO2.h.

Referenced by massFractions(), PorousFlowBrineCO2(), and saltComponentIndex().

◆ _T_c2k

const Real PorousFlowFluidStateBase::_T_c2k
protectedinherited

◆ _Tidx

const unsigned int PorousFlowFluidStateMultiComponentBase::_Tidx
protectedinherited

◆ _Tlower

const Real PorousFlowBrineCO2::_Tlower
protected

Temperature below which the Spycher, Pruess & Ennis-King (2003) model is used (K)

Definition at line 476 of file PorousFlowBrineCO2.h.

Referenced by equilibriumMoleFractions(), and smoothCubicInterpolation().

◆ _Tupper

const Real PorousFlowBrineCO2::_Tupper
protected

Temperature above which the Spycher & Pruess (2010) model is used (K)

Definition at line 478 of file PorousFlowBrineCO2.h.

Referenced by equilibriumMoleFractions(), and smoothCubicInterpolation().

◆ _Xidx

const unsigned int PorousFlowFluidStateMultiComponentBase::_Xidx
protectedinherited

◆ _Zidx

const unsigned int PorousFlowFluidStateMultiComponentBase::_Zidx
protectedinherited

◆ _Zmin

const Real PorousFlowBrineCO2::_Zmin
protected

Minimum Z - below this value all CO2 will be dissolved.

This reduces the computational burden when small values of Z are present

Definition at line 481 of file PorousFlowBrineCO2.h.

Referenced by massFractions().


The documentation for this class was generated from the following files: