# PorousFlowFullySaturatedMassTimeDerivative

Fully-saturated version of the single-component, single-phase fluid mass derivative wrt time

Consider a fully-saturated, single-phase, single-component fluid in a THM simulation. The time-derivatve terms from the fluid governing equation are (1) where and all other nomenclature is described here. Using the THM evolution of porosity, along with the assumption that the fluid bulk modulus, , and its volumetric thermal expansion coefficient, , are constant, and the fluid density is given by (2) the time derivative terms may be written as (3) Here is the so-called Biot Modulus: (4) and is an effective volumetric thermal expansion coefficient: (5) Notice that disregarding the premultiplication by , the above time-derivative terms in Eq. 3 would be linear in the variables , displacement, and , if and were constant.

In standard poro-mechanics it is usual to calculate and at the initial stage of simulation, and keep them fixed forever afterwards. Of course this is an approximation since and were derived using the explicit assumption of a porosity that depended on , , and , but it makes finding analytical solutions much easier. Therefore, PorousFlow offers the following Materials and Kernels. Using these Materials and Kernel allows immediate and precise comparison with analytical and numerical solutions of poro-mechanics.

1. PorousFlowConstantBiotModulus Material, which computes given by Eq. 4 during the initial stage of simulation, and keeps it fixed thereafter. It requires a Porosity Material, but that Material's Property is only used during the initial computation.

2. PorousFlowConstantThermalExpansionCoefficient Material, which computes given by Eq. 5 during the the initial stage of simulation, and keeps it fixed thereafter. It requires a Porosity Material, but that Material's Property is only used during the initial computation.

3. The PorousFlowFullySaturatedMassTimeDerivative Kernel, which computes one of the following contributions, depending upon the coupling_type flag:

• for fluid-flow-only problems;

• for TH problems;

• for HM problems;

• for THM problems.

The PorousFlowFullySaturatedMassTimeDerivative Kernel does not employ lumping, which is largely unecessary in this single-phase, single-component situation. This means only quad-point'' Materials are needed. In fact, when using all the FullySaturated flow Kernels (see governing equations) standard Materials evaluated at the quadpoints are needed, which saves on computation time and input-file length.

In each case, the initial pre-multiplication by is optional (indicated by the parenthases around ).

When the Kernel is pre-multiplied by , which is the default, it is computing the time derivative of fluid mass. This allows the Kernel to be easily used with the remainder of PorousFlow: the BCs, the Postprocessors, the AuxKernels, and the DiracKernels are all based on mass.

When the pre-multiplication is not performed, this Kernel is computing the time derivative of fluid volume. This has two great advantages:

• the time-derivatives are linearised, resulting in excellent nonlinear convergence;

• comparing with results from poro-mechanics theory is straightforward.

However, this means additional care must be taken.

• The flow Kernel PorousFlowFullySaturatedDarcyBase should also not pre-multiply by density.

• The BCs, Postprocessors, AuxKernels, and DiracKernels must be written in such a way to operate in the fluid-volume scenario rather than the default fluid-mass scenario.

• The flag consistent_with_displaced_mesh should be set false in the PorousFlowVolumetricStrain Material.

## Input Parameters

• variableThe name of the variable that this Kernel operates on

C++ Type:NonlinearVariableName

Options:

Description:The name of the variable that this Kernel operates on

• PorousFlowDictatorThe UserObject that holds the list of PorousFlow variable names.

C++ Type:UserObjectName

Options:

Description:The UserObject that holds the list of PorousFlow variable names.

### Required Parameters

• multiply_by_densityTrueIf true, then this Kernel is the time derivative of the fluid mass. If false, then this Kernel is the derivative of the fluid volume (which is common in poro-mechanics)

Default:True

C++ Type:bool

Options:

Description:If true, then this Kernel is the time derivative of the fluid mass. If false, then this Kernel is the derivative of the fluid volume (which is common in poro-mechanics)

• biot_coefficient1Biot coefficient

Default:1

C++ Type:double

Options:

Description:Biot coefficient

• coupling_typeHydroThe 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

Default:Hydro

C++ Type:MooseEnum

Options:Hydro ThermoHydro HydroMechanical ThermoHydroMechanical

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

• blockThe list of block ids (SubdomainID) that this object will be applied

C++ Type:std::vector

Options:

Description:The list of block ids (SubdomainID) that this object will be applied

### Optional Parameters

• enableTrueSet the enabled status of the MooseObject.

Default:True

C++ Type:bool

Options:

Description:Set the enabled status of the MooseObject.

• save_inThe name of auxiliary variables to save this Kernel's residual contributions to. Everything about that variable must match everything about this variable (the type, what blocks it's on, etc.)

C++ Type:std::vector

Options:

Description:The name of auxiliary variables to save this Kernel's residual contributions to. Everything about that variable must match everything about this variable (the type, what blocks it's on, etc.)

• use_displaced_meshFalseWhether or not this object should use the displaced mesh for computation. Note that in the case this is true but no displacements are provided in the Mesh block the undisplaced mesh will still be used.

Default:False

C++ Type:bool

Options:

Description:Whether or not this object should use the displaced mesh for computation. Note that in the case this is true but no displacements are provided in the Mesh block the undisplaced mesh will still be used.

• control_tagsAdds user-defined labels for accessing object parameters via control logic.

C++ Type:std::vector

Options:

Description:Adds user-defined labels for accessing object parameters via control logic.

• seed0The seed for the master random number generator

Default:0

C++ Type:unsigned int

Options:

Description:The seed for the master random number generator

• diag_save_inThe name of auxiliary variables to save this Kernel's diagonal Jacobian contributions to. Everything about that variable must match everything about this variable (the type, what blocks it's on, etc.)

C++ Type:std::vector

Options:

Description:The name of auxiliary variables to save this Kernel's diagonal Jacobian contributions to. Everything about that variable must match everything about this variable (the type, what blocks it's on, etc.)

• implicitTrueDetermines whether this object is calculated using an implicit or explicit form

Default:True

C++ Type:bool

Options:

Description:Determines whether this object is calculated using an implicit or explicit form

• vector_tagstimeThe tag for the vectors this Kernel should fill

Default:time

C++ Type:MultiMooseEnum

Options:nontime time

Description:The tag for the vectors this Kernel should fill

• extra_vector_tagsThe extra tags for the vectors this Kernel should fill

C++ Type:std::vector

Options:

Description:The extra tags for the vectors this Kernel should fill

• matrix_tagssystem timeThe tag for the matrices this Kernel should fill

Default:system time

C++ Type:MultiMooseEnum

Options:nontime system time

Description:The tag for the matrices this Kernel should fill

• extra_matrix_tagsThe extra tags for the matrices this Kernel should fill

C++ Type:std::vector

Options:

Description:The extra tags for the matrices this Kernel should fill