Water-steam equation of state

A single component two-phase model suitable for non-isothermal water-steam transport is available in PorousFlow based on the persistent variable approach.

The primary variables for this model are porepressure of the liquid phase and enthalpy, as they form a complete set of persistent variables. Temperature and vapor saturation are then calculated using these primary variables.

commentnote

This fluid state model must be run in a non-isothermal setting. If an isothermal model of water flow is required, just use one of the single phase models instead.

The temperature as a function of water porepressure and enthalpy is shown in Figure 1 for the entire range of pressure and temperature that this equation of state is valid for. In the two-phase region (inside the phase envelope shown in Figure 1), the water temperature is constant for a given pressure along the saturation curve as the phase transitions from a liquid (the region outside and to the left of the phase envelope) to a vapor (the region outside and to the right of the phase envelope). It is for this reason that pressure and temperature cannot be used as the primary variables, as they are not independent in this two-phase region.

Figure 1: Temperature of water as a function of porepressure and enthalpy. Phase envelope shown as solid line. (a) Full parameter space; (b) Vicinity of two-phase region. Isotherms shown as dashed lines.

The left-hand side of the phase envelope corresponds to a fully saturated liquid phase, while the right-hand side corresponds to a fully saturated vapor phase. In between, both liquid and vapor phases coexist, with the composition described by the vapor quality

X=mvml+mv,X = \frac{m_v}{m_l + m_v}, (1)

where mvm_v and mlm_l are the mass in the vapor and liquid phase, respectively. A fully saturated liquid phase therefore has a quality of 0 and a fully saturated vapor has a quality of 1.

Alternatively, vapor quality can be expressed in terms of enthalpy for a single-component system (e.g. water and water vapor)

X=hhlhvhl,X = \frac{h - h_l}{h_v - h_l}, (2)

where hh is the total enthalpy, and hvh_v and hlh_l are the enthalpies for fully saturated vapor and liquid phases, respectively. The quantity hvhlh_v - h_l is the enthalpy of vaporization, and corresponds to the enthalpy difference along an isotherm in the two-phase region (the enthalpies on the phase envelope at a given pressure).

The mass of phase α\alpha is defined as mα=ϕSαραm_{\alpha} = \phi S_{\alpha} \rho_{\alpha} where ϕ\phi is the porosity of the porous media, SαS_{\alpha} is the saturation of phase α\alpha and ρα\rho_{\alpha} its density. Using this definition and Eq. (2), the saturation of the vapor phase in the two-phase region can be calculated as

Sv=hρlhlρlhvρvhlρl+h(hvhl).S_v = \frac{h \rho_l - h_l \rho_l}{h_v \rho_v - h_l \rho_l + h(h_v - h_l)}. (3)

Thermophysical properties

In the single phase liquid or vapor regions, all water properties are calculated by first calculating temperature given porepressure and enthalpy (except for enthalpy, of course, which is a nonlinear variable in this case).

In the two-phase region, the properties of the liquid and vapor are calculated at the saturation temperature and pressure, with enthalpy given by the fully-saturated state for either vapor or liquid.

Implementation

Variables

This class requires pressure of the liquid phase and enthalpy as primary variables.

[Variables]
  [pliq]
    initial_condition = 1e6
  []
  [h]
    initial_condition = 8e5
    scaling = 1e-3
  []
[]
(modules/porous_flow/test/tests/fluidstate/water_vapor.i)
commentnote

These variables must be listed as PorousFlow variables in the PorousFlowDictator UserObject

In the simplest case, the number of fluid components should be set to one, and the number of phases set to two in the PorousFlowDictator.

[UserObjects]
  [dictator]
    type = PorousFlowDictator
    porous_flow_vars = 'pliq h'
    number_fluid_phases = 2
    number_fluid_components = 1
  []
[]
(modules/porous_flow/test/tests/fluidstate/water_vapor.i)

It can be beneficial to scale the residual contribution for each variable to assist nonlinear convergence. Following the discussion about convergence in the PorousFlow documentation, the residual contribution from the fluid heat equations is approximately 1,000 times larger than the residual contribution from the fluid mass equations.

UserObjects

This fluid state is implemented in the PorousFlowWaterVapor UserObject. This UserObject is a GeneralUserObject that contains methods that provide a complete thermophysical description of the model given pressure and enthalpy.

[UserObjects]
  [fs]
    type = PorousFlowWaterVapor
    water_fp = water
    capillary_pressure = pc
  []
[]
(modules/porous_flow/test/tests/fluidstate/water_vapor.i)

The water fluid formulation is set in the FluidProperties block

[FluidProperties]
  [water]
    type = Water97FluidProperties
  []
[]
(modules/porous_flow/test/tests/fluidstate/water_vapor.i)

Materials

The PorousFlowFluidStateSingleComponent material provides all phase pressures, saturation, densities, viscosities etc using the formulation provided in the PorousFlowWaterVapor UserObject.

[Materials]
  [watervapor]
    type = PorousFlowFluidStateSingleComponent
    porepressure = pliq
    enthalpy = h
    temperature_unit = Celsius
    capillary_pressure = pc
    fluid_state = fs
  []
[]
(modules/porous_flow/test/tests/fluidstate/water_vapor.i)

Initial condition

An initial condition that makes it easy to set enthalpy for a specified pressure and temperature (which may be more suitable for the user) is provided in PorousFlowFluidPropertyIC.

[ICs]
  [enthalpy]
    type = PorousFlowFluidPropertyIC
    variable = enthalpy
    property = enthalpy
    porepressure = pressure
    temperature = temperature
    fp = water
  []
  [internal_energy]
    type = PorousFlowFluidPropertyIC
    variable = internal_energy
    property = internal_energy
    porepressure = pressure
    temperature = temperature
    fp = water
  []
  [density]
    type = PorousFlowFluidPropertyIC
    variable = density
    property = density
    porepressure = pressure
    temperature = temperature
    fp = water
  []
[]
(modules/porous_flow/test/tests/ics/fluidpropic.i)