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]
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:
# Darcy flow
[Mesh]
[annular]
type = AnnularMeshGenerator
nr = 10
rmin = 1.0
rmax = 10
growth_r = 1.4
nt = 4
dmin = 0
dmax = 90
[]
[make3D]
type = MeshExtruderGenerator
extrusion_vector = '0 0 12'
num_layers = 3
bottom_sideset = 'bottom'
top_sideset = 'top'
input = annular
[]
[shift_down]
type = TransformGenerator
transform = TRANSLATE
vector_value = '0 0 -6'
input = make3D
[]
[aquifer]
type = SubdomainBoundingBoxGenerator
block_id = 1
bottom_left = '0 0 -2'
top_right = '10 10 2'
input = shift_down
[]
[injection_area]
type = ParsedGenerateSideset
combinatorial_geometry = 'x*x+y*y<1.01'
included_subdomains = 1
new_sideset_name = 'injection_area'
input = 'aquifer'
[]
[rename]
type = RenameBlockGenerator
old_block = '0 1'
new_block = 'caps aquifer'
input = 'injection_area'
[]
[]
[GlobalParams]
PorousFlowDictator = dictator
[]
[Variables]
[porepressure]
[]
[]
[PorousFlowBasicTHM]
porepressure = porepressure
coupling_type = Hydro
gravity = '0 0 0'
fp = the_simple_fluid
[]
[BCs]
[constant_injection_porepressure]
type = DirichletBC
variable = porepressure
value = 1E6
boundary = injection_area
[]
[]
[FluidProperties]
[the_simple_fluid]
type = SimpleFluidProperties
bulk_modulus = 2E9
viscosity = 1.0E-3
density0 = 1000.0
[]
[]
(modules/porous_flow/examples/tutorial/01.i)The DE of Eq. (1) is implemented in the following way
[Variables]
[porepressure]
[]
[]
[PorousFlowBasicTHM]
porepressure = porepressure
coupling_type = Hydro
gravity = '0 0 0'
fp = 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]
[constant_injection_porepressure]
type = DirichletBC
variable = porepressure
value = 1E6
boundary = injection_area
[]
[]
[FluidProperties]
[the_simple_fluid]
type = SimpleFluidProperties
bulk_modulus = 2E9
viscosity = 1.0E-3
density0 = 1000.0
[]
[]
[Materials]
[porosity]
type = PorousFlowPorosity
porosity_zero = 0.1
[]
[biot_modulus]
type = PorousFlowConstantBiotModulus
biot_coefficient = 0.8
solid_bulk_compliance = 2E-7
fluid_bulk_modulus = 1E7
[]
[permeability_aquifer]
type = PorousFlowPermeabilityConst
block = aquifer
permeability = '1E-14 0 0 0 1E-14 0 0 0 1E-14'
[]
[permeability_caps]
type = PorousFlowPermeabilityConst
block = caps
permeability = '1E-15 0 0 0 1E-15 0 0 0 1E-16'
[]
[]
[Preconditioning]
active = basic
[basic]
type = SMP
full = true
[]
[preferred_but_might_not_be_installed]
type = SMP
full = true
petsc_options_iname = '-pc_type -pc_factor_mat_solver_package'
petsc_options_value = ' lu mumps'
[]
[]
[Executioner]
type = Transient
solve_type = Newton
end_time = 1E6
dt = 1E5
nl_abs_tol = 1E-13
[]
[Outputs]
exodus = true
[]
(modules/porous_flow/examples/tutorial/01.i)The porosity, Biot modulus and permeability are defined through the Materials block:
[Materials]
[porosity]
type = PorousFlowPorosity
porosity_zero = 0.1
[]
[biot_modulus]
type = PorousFlowConstantBiotModulus
biot_coefficient = 0.8
solid_bulk_compliance = 2E-7
fluid_bulk_modulus = 1E7
[]
[permeability_aquifer]
type = PorousFlowPermeabilityConst
block = aquifer
permeability = '1E-14 0 0 0 1E-14 0 0 0 1E-14'
[]
[permeability_caps]
type = PorousFlowPermeabilityConst
block = caps
permeability = '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