Porous Flow Tutorial Page 01. A single fluid
This tutorial page describes how PorousFlow can be used to solve a very simple fluid-flow problem. The physics are described by the equation (1) This is the simplest type of equation that PorousFlow solves. It is often used in thermo-poro-elasticity, but PorousFlow is often employed to solve much more complex equations. See governing equations for further details, and PorousFlowFullySaturatedMassTimeDerivative and PorousFlowFullySaturatedDarcyBase for the derivation of Eq. (1) from the general governing equations. In this equation:
is the fluid porepressure (units of Pa)
an over-dot represents a time derivative
is the Biot Modulus (units of Pa)
is the Biot coefficient (dimensionless)
is the rate of volumetric strain of the solid rock (units s)
is the effective volumetric thermal expansion coefficient (units K)
is the temperature (units K)
represents a spatial derivative
is the permeability tensor (units m)
is the fluid viscosity (units Pa.s)
is the fluid density (units kg.m)
is the gravitational acceleration (units m.s)
The units suggested here are not mandatory: any consistent unit system may be used in MOOSE. For instance, in reservoir physics it is often convenient to express everything in MPa and years rather than Pa and seconds.
The Biot modulus is and the effective volumetric thermal expansion coefficient is In these equations
is the porosity (dimensionless)
is the bulk modulus of the fluid (units Pa)
is the bulk modulus of the drained porous skeleton (units Pa)
is the volumetric thermal expansion coefficient of the drained porous skeleton (units K)
is the volumetric thermal expansion coefficient of the fluid (units K)
The derivation of Eq. (1) from the full PorousFlow equations assumes that and are constant.
In this tutorial page we will be solving fluid flow only, so the and in Eq. Eq. (1) are ignored (set to zero).
All PorousFlow input files must contain a PorousFlowDictator, and almost all PorousFlow objects (Kernels, Materials, etc) require the PorousFlowDictator to be provided. This enables PorousFlow to make consistency checks on the number of fluid phases, components, chemical reactants, etc. Therefore, most input files specify its name in the Globals block:
[GlobalParams<<<{"href": "../../syntax/GlobalParams/index.html"}>>>]
PorousFlowDictator = dictator
[](modules/porous_flow/examples/tutorial/01.i)Most PorousFlow simulations require fluid properties to be supplied. In this instance, the SimpleFluidProperties are used, which assume a constant fluid bulk modulus and viscosity:
[FluidProperties<<<{"href": "../../syntax/FluidProperties/index.html"}>>>]
[the_simple_fluid]
type = SimpleFluidProperties<<<{"description": "Fluid properties for a simple fluid with a constant bulk density", "href": "../../source/fluidproperties/SimpleFluidProperties.html"}>>>
bulk_modulus<<<{"description": "Constant bulk modulus (Pa)"}>>> = 2E9
viscosity<<<{"description": "Constant dynamic viscosity (Pa.s)"}>>> = 1.0E-3
density0<<<{"description": "Density at zero pressure and zero temperature"}>>> = 1000.0
[]
[](modules/porous_flow/examples/tutorial/01.i)The DE of Eq. (1) is implemented in the following way
[Variables<<<{"href": "../../syntax/Variables/index.html"}>>>]
[porepressure]
[]
[]
[PorousFlowBasicTHM<<<{"href": "../../syntax/PorousFlowBasicTHM/index.html"}>>>]
porepressure<<<{"description": "The name of the porepressure variable"}>>> = porepressure
coupling_type<<<{"description": "The type of simulation. For simulations involving Mechanical deformations, you will need to supply the correct Biot coefficient. For simulations involving Thermal flows, you will need an associated ConstantThermalExpansionCoefficient Material"}>>> = Hydro
gravity<<<{"description": "Gravitational acceleration vector downwards (m/s^2)"}>>> = '0 0 0'
fp<<<{"description": "The name of the user object for fluid properties. Only needed if fluid_properties_type = PorousFlowSingleComponentFluid"}>>> = the_simple_fluid
[](modules/porous_flow/examples/tutorial/01.i)There is just one variable — the porepressure — and there is no coupling with heat or mechanics. Gravity is set to zero. The PorousFlowBasicTHM has other optional inputs that you are encouraged to explore, including setting the temperature to a non-default value, or to the value of an AuxVariable (your fluid properties may depend on temperature, even in an isothermal situation).
In this tutorial page, the only boundary condition is to fix the porepressure to 1MPa at the injection area (the other boundaries default to zero flux):
[BCs<<<{"href": "../../syntax/BCs/index.html"}>>>]
[constant_injection_porepressure]
type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "../../source/bcs/DirichletBC.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = porepressure
value<<<{"description": "Value of the BC"}>>> = 1E6
boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = injection_area
[]
[](modules/porous_flow/examples/tutorial/01.i)The porosity, Biot modulus and permeability are defined through the Materials block:
[Materials<<<{"href": "../../syntax/Materials/index.html"}>>>]
[porosity]
type = PorousFlowPorosity<<<{"description": "This Material calculates the porosity PorousFlow simulations", "href": "../../source/materials/PorousFlowPorosity.html"}>>>
porosity_zero<<<{"description": "The porosity at zero volumetric strain and reference temperature and reference effective porepressure and reference chemistry. This must be a real number or a constant monomial variable (not a linear lagrange or other type of variable)"}>>> = 0.1
[]
[biot_modulus]
type = PorousFlowConstantBiotModulus<<<{"description": "Computes the Biot Modulus, which is assumed to be constant for all time. Sometimes 1 / BiotModulus is called storativity", "href": "../../source/materials/PorousFlowConstantBiotModulus.html"}>>>
biot_coefficient<<<{"description": "Biot coefficient"}>>> = 0.8
solid_bulk_compliance<<<{"description": "Reciprocal of the drained bulk modulus of the porous skeleton. If strain = C * stress, then solid_bulk_compliance = de_ij de_kl C_ijkl. If the grain bulk modulus is Kg then 1/Kg = (1 - biot_coefficient) * solid_bulk_compliance."}>>> = 2E-7
fluid_bulk_modulus<<<{"description": "Fluid bulk modulus"}>>> = 1E7
[]
[permeability_aquifer]
type = PorousFlowPermeabilityConst<<<{"description": "This Material calculates the permeability tensor assuming it is constant", "href": "../../source/materials/PorousFlowPermeabilityConst.html"}>>>
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = aquifer
permeability<<<{"description": "The permeability tensor (usually in m^2), which is assumed constant for this material"}>>> = '1E-14 0 0 0 1E-14 0 0 0 1E-14'
[]
[permeability_caps]
type = PorousFlowPermeabilityConst<<<{"description": "This Material calculates the permeability tensor assuming it is constant", "href": "../../source/materials/PorousFlowPermeabilityConst.html"}>>>
block<<<{"description": "The list of blocks (ids or names) that this object will be applied"}>>> = caps
permeability<<<{"description": "The permeability tensor (usually in m^2), which is assumed constant for this material"}>>> = '1E-15 0 0 0 1E-15 0 0 0 1E-16'
[]
[](modules/porous_flow/examples/tutorial/01.i)The result is shown in Figure 1

Figure 1: Porepressure evolution in the borehole-aquifer-caprock system.