- PorousFlowDictatorThe UserObject that holds the list of PorousFlow variable names
C++ Type:UserObjectName
Controllable:No
Description:The UserObject that holds the list of PorousFlow variable names
- boundaryThe list of boundary IDs from the mesh where this object applies
C++ Type:std::vector<BoundaryName>
Controllable:No
Description:The list of boundary IDs from the mesh where this object applies
- gravityGravitational acceleration vector downwards (m/s^2)
C++ Type:libMesh::VectorValue<double>
Unit:(no unit assumed)
Controllable:No
Description:Gravitational acceleration vector downwards (m/s^2)
- variableThe name of the variable that this residual object operates on
C++ Type:NonlinearVariableName
Unit:(no unit assumed)
Controllable:No
Description:The name of the variable that this residual object operates on
PorousFlowOutflowBC
This adds the following term to the residual Various forms for may be chosen, as discussed next, so that this BC removes fluid species or heat energy through at exactly the rate specified by the multi-component, multi-phase Darcy-Richards equation, or the heat equation. Therefore, this BC can be used to represent a "free" boundary through which fluid or heat can freely flow: the boundary is "invisible" to the simulation. Alternate PorousFlow boundary conditions, such as those allowing boundary fluxes to be prescribed, are discussed here.
Ensure your normal vector points out of the model, otherwise your fluxes will have the wrong sign
PorousFlowOutflowBC
does not model the interface of the model with "empty space". Imagine a model of a porous-media pipe containing water. PorousFlowOutflowBC
does not model the situation where the pipe has an end through which the water flows into empty space. Instead, PorousFlowOutflowBC
allows only part of the pipe to be modelled: when water exits the model it continues freely into the unmodelled section of the pipe. In this sense, the model's boundary is "invisible" to the simulation. This has a further consequence: if there is a sink in the modelled section, PorousFlowOutflowBC
will allow water to flow from the unmodelled section into the modelled section.
The rate of outflow is limited by the permeability, the viscosity of the fluid, etc, in exactly the same way that the Darcy velocity is limited by these quantities. This means, for instance, if you inject a lot of fluid or heat into the model, it will take the PorousFlowOutflowBC
some time to "suck" it all out.
Worked examples of this boundary condition may be found in the boundaries documentation.
This BC is fully upwinded, so can be used in conjunction with the PorousFlowAdvectiveFlux, PorousFlowHeatAdvection and PorousFlowHeatConduction Kernels.
Fluid flow
To allow a fluid species, , to flow freely out of the model, the governing equations imply that where the standard Porous Flow nomenclature has been used. Many PorousFlow simulations do not involve diffusion and dispersion, so the latter term is not included in PorousFlowOutflowBC
: is simply
Input-file syntax for this type of boundary condition requires specifying:
flux_type = fluid
(the default);the
mass_fraction_component
;the flag
include_relperm
, which should only be setfalse
in fully-saturated situations where there is no notion of relative permeability;the flag
multiply_by_density
, which means the above expression is not premultiplied by . This allows thePorousFlowOutflowBC
to be used with other objects that do not multiply by density in simulations based on fluid volume instead of fluid mass.
Heat flow
To allow heat energy to flow freely out of the model, the governing equations imply that
Input-file syntax for this type of boundary condition requires specifying:
flux_type = heat
;the flag
include_relperm
, which should only be setfalse
in fully-saturated situations where there is no notion of relative permeability.
In this case, multiply_by_density
is set to true
irrespective of the choice set by the user, since it is an error not to multiply by density. Any mass_fraction_component
specified is ignored.
Example: single-phase, single-component fluid-flow through a boundary
The most basic usage of PorousFlowOutflowBC is illustrated in the following:
[BCs<<<{"href": "../../syntax/BCs/index.html"}>>>]
[outflow]
type = PorousFlowOutflowBC<<<{"description": "Applies an 'outflow' boundary condition, which allows fluid components or heat energy to flow freely out of the boundary as if it weren't there. This is fully upwinded", "href": "PorousFlowOutflowBC.html"}>>>
boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'left right top bottom'
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = pp
save_in<<<{"description": "The name of auxiliary variables to save this BC's residual contributions to. Everything about that variable must match everything about this variable (the type, what blocks it's on, etc.)"}>>> = nodal_outflow
[]
[]
[AuxVariables<<<{"href": "../../syntax/AuxVariables/index.html"}>>>]
[nodal_outflow]
[]
[]
[Postprocessors<<<{"href": "../../syntax/Postprocessors/index.html"}>>>]
[outflow_kg_per_s]
type = NodalSum<<<{"description": "Computes the sum of all of the nodal values of the specified variable. Note: This object sets the default \"unique_node_execute\" flag to true to avoid double counting nodes between shared blocks.", "href": "../postprocessors/NodalSum.html"}>>>
boundary<<<{"description": "The list of boundaries (ids or names) from the mesh where this object applies"}>>> = 'left right top bottom'
variable<<<{"description": "The name of the variable that this postprocessor operates on"}>>> = nodal_outflow
[]
[]
(moose/modules/porous_flow/test/tests/sinks/s14.i)In this input-file, all boundaries are of the "outflow" type, and the total flow rate (kg.s) is recorded into the outflow_kg_per_s
using a NodalSum postprocessor.
Example: heat flow through a boundary
A PorousFlowOutflowBC with flux_type = heat
will allow heat to flow through a boundary. To record the total heat-energy flowing through the boundary a NodalSum postprocessor should be used:
[BCs<<<{"href": "../../syntax/BCs/index.html"}>>>]
[outflow]
type = PorousFlowOutflowBC<<<{"description": "Applies an 'outflow' boundary condition, which allows fluid components or heat energy to flow freely out of the boundary as if it weren't there. This is fully upwinded", "href": "PorousFlowOutflowBC.html"}>>>
boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = 'left right top bottom'
flux_type<<<{"description": "The type of boundary condition to apply. 'fluid' means this boundary condition will allow a fluid component to flow freely from the boundary. 'heat' means this boundary condition will allow heat energy to flow freely from the boundary"}>>> = heat
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = T
save_in<<<{"description": "The name of auxiliary variables to save this BC's residual contributions to. Everything about that variable must match everything about this variable (the type, what blocks it's on, etc.)"}>>> = nodal_outflow
[]
[]
[AuxVariables<<<{"href": "../../syntax/AuxVariables/index.html"}>>>]
[nodal_outflow]
[]
[]
[Postprocessors<<<{"href": "../../syntax/Postprocessors/index.html"}>>>]
[outflow_J_per_s]
type = NodalSum<<<{"description": "Computes the sum of all of the nodal values of the specified variable. Note: This object sets the default \"unique_node_execute\" flag to true to avoid double counting nodes between shared blocks.", "href": "../postprocessors/NodalSum.html"}>>>
boundary<<<{"description": "The list of boundaries (ids or names) from the mesh where this object applies"}>>> = 'left right top bottom'
variable<<<{"description": "The name of the variable that this postprocessor operates on"}>>> = nodal_outflow
[]
[]
(moose/modules/porous_flow/test/tests/sinks/s15.i)A multicomponent example
A fully-saturated 2-component modelled on a 1D line segment, :
[PorousFlowFullySaturated<<<{"href": "../../syntax/PorousFlowFullySaturated/index.html"}>>>]
fp<<<{"description": "The name of the user object for fluid properties. Only needed if fluid_properties_type = PorousFlowSingleComponentFluid"}>>> = simple_fluid
porepressure<<<{"description": "The name of the porepressure variable"}>>> = pp
mass_fraction_vars<<<{"description": "List of variables that represent the mass fractions. With only one fluid component, this may be left empty. With N fluid components, the format is 'f_0 f_1 f_2 ... f_(N-1)'. That is, the N^th component need not be specified because f_N = 1 - (f_0 + f_1 + ... + f_(N-1)). It is best numerically to choose the N-1 mass fraction variables so that they represent the fluid components with small concentrations. This Action will associated the i^th mass fraction variable to the equation for the i^th fluid component, and the pressure variable to the N^th fluid component."}>>> = frac
[]
(moose/modules/porous_flow/test/tests/sinks/s13.i)The model initializes with the porous material fully filled with component = 1 (that is, frac = 0
) and with a porepressure gradient that will move fluid from negative to positive :
[Variables<<<{"href": "../../syntax/Variables/index.html"}>>>]
[pp]
[]
[frac]
[]
[]
(moose/modules/porous_flow/test/tests/sinks/s13.i)[ICs<<<{"href": "../../syntax/ICs/index.html"}>>>]
[pp]
type = FunctionIC<<<{"description": "An initial condition that uses a normal function of x, y, z to produce values (and optionally gradients) for a field variable.", "href": "../ics/FunctionIC.html"}>>>
variable<<<{"description": "The variable this initial condition is supposed to provide values for."}>>> = pp
function<<<{"description": "The initial condition function."}>>> = 1-x
[]
[]
(moose/modules/porous_flow/test/tests/sinks/s13.i)For , fluid component (the frac
variable) is introduced on the material's left side (), by applying the fixed boundary conditions: The right-hand side, at , has fixed porepressure while the fluid component (the frac
variable) is allowed to freely exit the domain when it arrives there.
Porepressure is held at
pp = 1
at . (Physically this adds or removes component = 1 to ensure that porepressure is fixed.)Porepressure is held at
pp = 0
at . (Physically this adds or removes component = 1 to ensure that porepressure is fixed.) These two BCs ensure the porepressure gradient is maintained.The zeroth mass fraction is held at
frac = 1
at .The zeroth mass fraction is allowed to freely exit the model at .
The former 3 are implemented using DirichletBC, while the latter is the PorousFlowOutflowBC
. It acts on mass_fraction_component = 0
because that is the mass-fraction associated to the frac
variable by the PorousFlowFullySaturated Action:
[BCs<<<{"href": "../../syntax/BCs/index.html"}>>>]
[lhs_fixed_b]
type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "DirichletBC.html"}>>>
boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = left
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = pp
value<<<{"description": "Value of the BC"}>>> = 1
[]
[rhs_fixed_b]
type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "DirichletBC.html"}>>>
boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = right
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = pp
value<<<{"description": "Value of the BC"}>>> = 0
[]
[lhs_fixed_a]
type = DirichletBC<<<{"description": "Imposes the essential boundary condition $u=g$, where $g$ is a constant, controllable value.", "href": "DirichletBC.html"}>>>
boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = left
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = frac
value<<<{"description": "Value of the BC"}>>> = 1
[]
[outflow_a]
type = PorousFlowOutflowBC<<<{"description": "Applies an 'outflow' boundary condition, which allows fluid components or heat energy to flow freely out of the boundary as if it weren't there. This is fully upwinded", "href": "PorousFlowOutflowBC.html"}>>>
boundary<<<{"description": "The list of boundary IDs from the mesh where this object applies"}>>> = right
include_relperm<<<{"description": "If true, the Darcy flux will include the relative permeability. If false, the relative permeability will not be used, which must only be used for fully-saturated situations where there is no notion of relative permeability"}>>> = false # no need for relperm in this fully-saturated simulation
mass_fraction_component<<<{"description": "The index corresponding to a fluid component. If supplied, the residual contribution will be multiplied by the mass fraction, corresponding to allowing the given mass fraction to flow freely from the boundary. This is ignored if flux_type = heat"}>>> = 0
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = frac
[]
[]
(moose/modules/porous_flow/test/tests/sinks/s13.i)The results are shown in Figure 1 where it can be seen the fluid component freely exits the right-hand boundary.

Figure 1: Advection and diffusion of a fluid component from left to right along a porepressure gradient. The fluid component is free to exit the right-hand boundary due to the PorousFlowOutflowBC there.
Further description of this result and further examples may be found in the boundaries documentation and sinks tests documentation.
Input Parameters
- displacementsThe displacements
C++ Type:std::vector<VariableName>
Unit:(no unit assumed)
Controllable:No
Description:The displacements
- flux_typefluidThe type of boundary condition to apply. 'fluid' means this boundary condition will allow a fluid component to flow freely from the boundary. 'heat' means this boundary condition will allow heat energy to flow freely from the boundary
Default:fluid
C++ Type:MooseEnum
Controllable:No
Description:The type of boundary condition to apply. 'fluid' means this boundary condition will allow a fluid component to flow freely from the boundary. 'heat' means this boundary condition will allow heat energy to flow freely from the boundary
- include_relpermTrueIf true, the Darcy flux will include the relative permeability. If false, the relative permeability will not be used, which must only be used for fully-saturated situations where there is no notion of relative permeability
Default:True
C++ Type:bool
Controllable:No
Description:If true, the Darcy flux will include the relative permeability. If false, the relative permeability will not be used, which must only be used for fully-saturated situations where there is no notion of relative permeability
- mass_fraction_component0The index corresponding to a fluid component. If supplied, the residual contribution will be multiplied by the mass fraction, corresponding to allowing the given mass fraction to flow freely from the boundary. This is ignored if flux_type = heat
Default:0
C++ Type:unsigned int
Controllable:No
Description:The index corresponding to a fluid component. If supplied, the residual contribution will be multiplied by the mass fraction, corresponding to allowing the given mass fraction to flow freely from the boundary. This is ignored if flux_type = heat
- matrix_onlyFalseWhether this object is only doing assembly to matrices (no vectors)
Default:False
C++ Type:bool
Controllable:No
Description:Whether this object is only doing assembly to matrices (no vectors)
- multiply_by_densityTrueIf true, this BC represents mass flux. If false, it represents volume flux. User input of this flag is ignored if flux_type = heat as multiply_by_density should always be true in that case
Default:True
C++ Type:bool
Controllable:No
Description:If true, this BC represents mass flux. If false, it represents volume flux. User input of this flag is ignored if flux_type = heat as multiply_by_density should always be true in that case
Optional Parameters
- absolute_value_vector_tagsThe tags for the vectors this residual object should fill with the absolute value of the residual contribution
C++ Type:std::vector<TagName>
Controllable:No
Description:The tags for the vectors this residual object should fill with the absolute value of the residual contribution
- extra_matrix_tagsThe extra tags for the matrices this Kernel should fill
C++ Type:std::vector<TagName>
Controllable:No
Description:The extra tags for the matrices this Kernel should fill
- extra_vector_tagsThe extra tags for the vectors this Kernel should fill
C++ Type:std::vector<TagName>
Controllable:No
Description:The extra tags for the vectors this Kernel should fill
- matrix_tagssystemThe tag for the matrices this Kernel should fill
Default:system
C++ Type:MultiMooseEnum
Controllable:No
Description:The tag for the matrices this Kernel should fill
- vector_tagsnontimeThe tag for the vectors this Kernel should fill
Default:nontime
C++ Type:MultiMooseEnum
Controllable:No
Description:The tag for the vectors this Kernel should fill
Contribution To Tagged Field Data Parameters
- control_tagsAdds user-defined labels for accessing object parameters via control logic.
C++ Type:std::vector<std::string>
Controllable:No
Description:Adds user-defined labels for accessing object parameters via control logic.
- diag_save_inThe name of auxiliary variables to save this BC'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<AuxVariableName>
Unit:(no unit assumed)
Controllable:No
Description:The name of auxiliary variables to save this BC's diagonal jacobian contributions to. Everything about that variable must match everything about this variable (the type, what blocks it's on, etc.)
- enableTrueSet the enabled status of the MooseObject.
Default:True
C++ Type:bool
Controllable:Yes
Description:Set the enabled status of the MooseObject.
- implicitTrueDetermines whether this object is calculated using an implicit or explicit form
Default:True
C++ Type:bool
Controllable:No
Description:Determines whether this object is calculated using an implicit or explicit form
- multiplier1Multiply the flux by this number. This is mainly used for testing purposes
Default:1
C++ Type:double
Unit:(no unit assumed)
Controllable:No
Description:Multiply the flux by this number. This is mainly used for testing purposes
- save_inThe name of auxiliary variables to save this BC'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<AuxVariableName>
Unit:(no unit assumed)
Controllable:No
Description:The name of auxiliary variables to save this BC's residual contributions to. Everything about that variable must match everything about this variable (the type, what blocks it's on, etc.)
- seed0The seed for the master random number generator
Default:0
C++ Type:unsigned int
Controllable:No
Description:The seed for the master random number generator
- skip_execution_outside_variable_domainFalseWhether to skip execution of this boundary condition when the variable it applies to is not defined on the boundary. This can facilitate setups with moving variable domains and fixed boundaries. Note that the FEProblem boundary-restricted integrity checks will also need to be turned off if using this option
Default:False
C++ Type:bool
Controllable:No
Description:Whether to skip execution of this boundary condition when the variable it applies to is not defined on the boundary. This can facilitate setups with moving variable domains and fixed boundaries. Note that the FEProblem boundary-restricted integrity checks will also need to be turned off if using this option
- 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
Controllable:No
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.
Advanced Parameters
- prop_getter_suffixAn optional suffix parameter that can be appended to any attempt to retrieve/get material properties. The suffix will be prepended with a '_' character.
C++ Type:MaterialPropertyName
Unit:(no unit assumed)
Controllable:No
Description:An optional suffix parameter that can be appended to any attempt to retrieve/get material properties. The suffix will be prepended with a '_' character.
- use_interpolated_stateFalseFor the old and older state use projected material properties interpolated at the quadrature points. To set up projection use the ProjectedStatefulMaterialStorageAction.
Default:False
C++ Type:bool
Controllable:No
Description:For the old and older state use projected material properties interpolated at the quadrature points. To set up projection use the ProjectedStatefulMaterialStorageAction.