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.
commentnote
Ensure your normal vector points out of the model, otherwise your fluxes will have the wrong sign
warningwarning
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.
commentnote
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 set false
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 the PorousFlowOutflowBC
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:
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]
[outflow]
type = PorousFlowOutflowBC
boundary = 'left right top bottom'
variable = pp
save_in = nodal_outflow
[]
[]
[AuxVariables]
[nodal_outflow]
[]
[]
[Postprocessors]
[outflow_kg_per_s]
type = NodalSum
boundary = 'left right top bottom'
variable = nodal_outflow
[]
[]
(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]
[outflow]
type = PorousFlowOutflowBC
boundary = 'left right top bottom'
flux_type = heat
variable = T
save_in = nodal_outflow
[]
[]
[AuxVariables]
[nodal_outflow]
[]
[]
[Postprocessors]
[outflow_J_per_s]
type = NodalSum
boundary = 'left right top bottom'
variable = nodal_outflow
[]
[]
(modules/porous_flow/test/tests/sinks/s15.i)(modules/porous_flow/test/tests/sinks/s14.i)
# Apply a PorousFlowPointSourceFromPostprocessor that injects 1kg/s into a 2D model, and PorousFlowOutflowBCs to the outer boundaries to show that the PorousFlowOutflowBCs allow fluid to exit freely at the appropriate rate
[Mesh]
type = GeneratedMesh
dim = 2
nx = 3
xmin = -1
xmax = 1
ny = 2
ymin = -2
ymax = 2
[]
[GlobalParams]
PorousFlowDictator = dictator
gravity = '0 0 0'
[]
[Variables]
[pp]
[]
[]
[PorousFlowFullySaturated]
fp = simple_fluid
porepressure = pp
[]
[DiracKernels]
[injection]
type = PorousFlowPointSourceFromPostprocessor
mass_flux = 1
point = '0 0 0'
variable = pp
[]
[]
[FluidProperties]
[simple_fluid]
type = SimpleFluidProperties
bulk_modulus = 1
[]
[]
[Materials]
[porosity]
type = PorousFlowPorosityConst
porosity = 0.12
[]
[permeability]
type = PorousFlowPermeabilityConst
permeability = '0.4 0 0 0 0.4 0 0 0 0.4'
[]
[]
[BCs]
[outflow]
type = PorousFlowOutflowBC
boundary = 'left right top bottom'
variable = pp
save_in = nodal_outflow
[]
[]
[AuxVariables]
[nodal_outflow]
[]
[]
[Postprocessors]
[outflow_kg_per_s]
type = NodalSum
boundary = 'left right top bottom'
variable = nodal_outflow
[]
[]
[Preconditioning]
[andy]
type = SMP
full = true
[]
[]
[Executioner]
type = Transient
solve_type = Newton
dt = 3E-4
end_time = 30E-4
nl_abs_tol = 1E-9
nl_rel_tol = 1E-9
[]
[Outputs]
csv = true
[]
(modules/porous_flow/test/tests/sinks/s15.i)
# Apply a PorousFlowPointSourceFromPostprocessor that injects 1J/s into a 2D model, and PorousFlowOutflowBCs to the outer boundaries to show that the PorousFlowOutflowBCs allow heat-energy to exit freely at the appropriate rate
[Mesh]
type = GeneratedMesh
dim = 2
nx = 3
xmin = -1
xmax = 1
ny = 2
ymin = -2
ymax = 2
[]
[GlobalParams]
PorousFlowDictator = dictator
gravity = '0 0 0'
[]
[Variables]
[pp]
[]
[T]
scaling = 1E-7
[]
[]
[PorousFlowFullySaturated]
fp = simple_fluid
coupling_type = thermohydro
porepressure = pp
temperature = T
[]
[DiracKernels]
[injection]
type = PorousFlowPointSourceFromPostprocessor
mass_flux = 1
point = '0 0 0'
variable = T
[]
[]
[FluidProperties]
[simple_fluid]
type = SimpleFluidProperties
bulk_modulus = 1
[]
[]
[Materials]
[porosity]
type = PorousFlowPorosityConst
porosity = 0.12
[]
[permeability]
type = PorousFlowPermeabilityConst
permeability = '0.4 0 0 0 0.4 0 0 0 0.4'
[]
[matrix]
type = PorousFlowMatrixInternalEnergy
density = 0.15
specific_heat_capacity = 1.5
[]
[thermal_cond]
type = PorousFlowThermalConductivityIdeal
dry_thermal_conductivity = '0.3 0 0 0 0.3 0 0 0 0.3'
[]
[]
[BCs]
[outflow]
type = PorousFlowOutflowBC
boundary = 'left right top bottom'
flux_type = heat
variable = T
save_in = nodal_outflow
[]
[]
[AuxVariables]
[nodal_outflow]
[]
[]
[Postprocessors]
[outflow_J_per_s]
type = NodalSum
boundary = 'left right top bottom'
variable = nodal_outflow
[]
[]
[Preconditioning]
[andy]
type = SMP
full = true
[]
[]
[Executioner]
type = Transient
solve_type = Newton
dt = 2E6
end_time = 2E7
nl_abs_tol = 1E-14
# nl_rel_tol = 1E-12
[]
[Outputs]
csv = true
[]
(modules/porous_flow/test/tests/sinks/s13.i)
# Apply a PorousFlowOutflowBC to the right-hand side and watch fluid flow to it
#
# This test has a single phase with two components. The test initialises with
# the porous material fully filled with component=1. The left-hand side is fixed
# at porepressure=1 and mass-fraction of the zeroth component being unity.
# The right-hand side has
# - porepressure fixed at zero via a DirichletBC: physically this removes component=1
# to ensure that porepressure remains fixed
# - a PorousFlowOutflowBC for the component=0 to allow that component to exit the boundary freely
#
# Therefore, the zeroth fluid component will flow from left to right (down the
# pressure gradient).
#
# The important DE is
# porosity * dc/dt = (perm / visc) * grad(P) * grad(c)
# which is true for c = mass-fraction, and very large bulk modulus of the fluid.
# For grad(P) constant in time and space (as in this example) this is just the
# advection equation for c, with velocity = perm / visc / porosity. The parameters
# are chosen to velocity = 1 m/s.
# In the numerical world, and especially with full upwinding, the advection equation
# suffers from diffusion. In this example, the diffusion is obvious when plotting
# the mass-fraction along the line, but the average velocity of the front is still
# correct at 1 m/s.
[Mesh]
type = GeneratedMesh
dim = 1
nx = 100
xmin = 0
xmax = 1
[]
[GlobalParams]
PorousFlowDictator = dictator
gravity = '0 0 0'
[]
[Variables]
[pp]
[]
[frac]
[]
[]
[PorousFlowFullySaturated]
fp = simple_fluid
porepressure = pp
mass_fraction_vars = frac
[]
[ICs]
[pp]
type = FunctionIC
variable = pp
function = 1-x
[]
[]
[FluidProperties]
[simple_fluid]
type = SimpleFluidProperties
bulk_modulus = 1e10 # need large in order for constant-velocity advection
density0 = 1 # irrelevant
thermal_expansion = 0
viscosity = 11
[]
[]
[Materials]
[porosity]
type = PorousFlowPorosityConst
porosity = 0.1
[]
[permeability]
type = PorousFlowPermeabilityConst
permeability = '1.1 0 0 0 1.1 0 0 0 1.1'
[]
[]
[BCs]
[lhs_fixed_b]
type = DirichletBC
boundary = left
variable = pp
value = 1
[]
[rhs_fixed_b]
type = DirichletBC
boundary = right
variable = pp
value = 0
[]
[lhs_fixed_a]
type = DirichletBC
boundary = left
variable = frac
value = 1
[]
[outflow_a]
type = PorousFlowOutflowBC
boundary = right
include_relperm = false # no need for relperm in this fully-saturated simulation
mass_fraction_component = 0
variable = frac
[]
[]
[Preconditioning]
[andy]
type = SMP
full = true
petsc_options_iname = '-pc_type -sub_pc_type -sub_pc_factor_shift_type -pc_asm_overlap'
petsc_options_value = 'asm lu NONZERO 2'
[]
[]
[Executioner]
type = Transient
solve_type = Newton
dt = 1E-2
end_time = 1
nl_rel_tol = 1E-12
nl_abs_tol = 1E-12
[]
[VectorPostprocessors]
[mf]
type = LineValueSampler
start_point = '0 0 0'
end_point = '1 0 0'
num_points = 100
sort_by = x
variable = frac
[]
[]
[Outputs]
[console]
type = Console
execute_on = 'nonlinear linear'
[]
[csv]
type = CSV
sync_times = '0.1 0.5 1'
sync_only = true
[]
time_step_interval = 10
[]
(modules/porous_flow/test/tests/sinks/s13.i)
# Apply a PorousFlowOutflowBC to the right-hand side and watch fluid flow to it
#
# This test has a single phase with two components. The test initialises with
# the porous material fully filled with component=1. The left-hand side is fixed
# at porepressure=1 and mass-fraction of the zeroth component being unity.
# The right-hand side has
# - porepressure fixed at zero via a DirichletBC: physically this removes component=1
# to ensure that porepressure remains fixed
# - a PorousFlowOutflowBC for the component=0 to allow that component to exit the boundary freely
#
# Therefore, the zeroth fluid component will flow from left to right (down the
# pressure gradient).
#
# The important DE is
# porosity * dc/dt = (perm / visc) * grad(P) * grad(c)
# which is true for c = mass-fraction, and very large bulk modulus of the fluid.
# For grad(P) constant in time and space (as in this example) this is just the
# advection equation for c, with velocity = perm / visc / porosity. The parameters
# are chosen to velocity = 1 m/s.
# In the numerical world, and especially with full upwinding, the advection equation
# suffers from diffusion. In this example, the diffusion is obvious when plotting
# the mass-fraction along the line, but the average velocity of the front is still
# correct at 1 m/s.
[Mesh]
type = GeneratedMesh
dim = 1
nx = 100
xmin = 0
xmax = 1
[]
[GlobalParams]
PorousFlowDictator = dictator
gravity = '0 0 0'
[]
[Variables]
[pp]
[]
[frac]
[]
[]
[PorousFlowFullySaturated]
fp = simple_fluid
porepressure = pp
mass_fraction_vars = frac
[]
[ICs]
[pp]
type = FunctionIC
variable = pp
function = 1-x
[]
[]
[FluidProperties]
[simple_fluid]
type = SimpleFluidProperties
bulk_modulus = 1e10 # need large in order for constant-velocity advection
density0 = 1 # irrelevant
thermal_expansion = 0
viscosity = 11
[]
[]
[Materials]
[porosity]
type = PorousFlowPorosityConst
porosity = 0.1
[]
[permeability]
type = PorousFlowPermeabilityConst
permeability = '1.1 0 0 0 1.1 0 0 0 1.1'
[]
[]
[BCs]
[lhs_fixed_b]
type = DirichletBC
boundary = left
variable = pp
value = 1
[]
[rhs_fixed_b]
type = DirichletBC
boundary = right
variable = pp
value = 0
[]
[lhs_fixed_a]
type = DirichletBC
boundary = left
variable = frac
value = 1
[]
[outflow_a]
type = PorousFlowOutflowBC
boundary = right
include_relperm = false # no need for relperm in this fully-saturated simulation
mass_fraction_component = 0
variable = frac
[]
[]
[Preconditioning]
[andy]
type = SMP
full = true
petsc_options_iname = '-pc_type -sub_pc_type -sub_pc_factor_shift_type -pc_asm_overlap'
petsc_options_value = 'asm lu NONZERO 2'
[]
[]
[Executioner]
type = Transient
solve_type = Newton
dt = 1E-2
end_time = 1
nl_rel_tol = 1E-12
nl_abs_tol = 1E-12
[]
[VectorPostprocessors]
[mf]
type = LineValueSampler
start_point = '0 0 0'
end_point = '1 0 0'
num_points = 100
sort_by = x
variable = frac
[]
[]
[Outputs]
[console]
type = Console
execute_on = 'nonlinear linear'
[]
[csv]
type = CSV
sync_times = '0.1 0.5 1'
sync_only = true
[]
time_step_interval = 10
[]
(modules/porous_flow/test/tests/sinks/s13.i)
# Apply a PorousFlowOutflowBC to the right-hand side and watch fluid flow to it
#
# This test has a single phase with two components. The test initialises with
# the porous material fully filled with component=1. The left-hand side is fixed
# at porepressure=1 and mass-fraction of the zeroth component being unity.
# The right-hand side has
# - porepressure fixed at zero via a DirichletBC: physically this removes component=1
# to ensure that porepressure remains fixed
# - a PorousFlowOutflowBC for the component=0 to allow that component to exit the boundary freely
#
# Therefore, the zeroth fluid component will flow from left to right (down the
# pressure gradient).
#
# The important DE is
# porosity * dc/dt = (perm / visc) * grad(P) * grad(c)
# which is true for c = mass-fraction, and very large bulk modulus of the fluid.
# For grad(P) constant in time and space (as in this example) this is just the
# advection equation for c, with velocity = perm / visc / porosity. The parameters
# are chosen to velocity = 1 m/s.
# In the numerical world, and especially with full upwinding, the advection equation
# suffers from diffusion. In this example, the diffusion is obvious when plotting
# the mass-fraction along the line, but the average velocity of the front is still
# correct at 1 m/s.
[Mesh]
type = GeneratedMesh
dim = 1
nx = 100
xmin = 0
xmax = 1
[]
[GlobalParams]
PorousFlowDictator = dictator
gravity = '0 0 0'
[]
[Variables]
[pp]
[]
[frac]
[]
[]
[PorousFlowFullySaturated]
fp = simple_fluid
porepressure = pp
mass_fraction_vars = frac
[]
[ICs]
[pp]
type = FunctionIC
variable = pp
function = 1-x
[]
[]
[FluidProperties]
[simple_fluid]
type = SimpleFluidProperties
bulk_modulus = 1e10 # need large in order for constant-velocity advection
density0 = 1 # irrelevant
thermal_expansion = 0
viscosity = 11
[]
[]
[Materials]
[porosity]
type = PorousFlowPorosityConst
porosity = 0.1
[]
[permeability]
type = PorousFlowPermeabilityConst
permeability = '1.1 0 0 0 1.1 0 0 0 1.1'
[]
[]
[BCs]
[lhs_fixed_b]
type = DirichletBC
boundary = left
variable = pp
value = 1
[]
[rhs_fixed_b]
type = DirichletBC
boundary = right
variable = pp
value = 0
[]
[lhs_fixed_a]
type = DirichletBC
boundary = left
variable = frac
value = 1
[]
[outflow_a]
type = PorousFlowOutflowBC
boundary = right
include_relperm = false # no need for relperm in this fully-saturated simulation
mass_fraction_component = 0
variable = frac
[]
[]
[Preconditioning]
[andy]
type = SMP
full = true
petsc_options_iname = '-pc_type -sub_pc_type -sub_pc_factor_shift_type -pc_asm_overlap'
petsc_options_value = 'asm lu NONZERO 2'
[]
[]
[Executioner]
type = Transient
solve_type = Newton
dt = 1E-2
end_time = 1
nl_rel_tol = 1E-12
nl_abs_tol = 1E-12
[]
[VectorPostprocessors]
[mf]
type = LineValueSampler
start_point = '0 0 0'
end_point = '1 0 0'
num_points = 100
sort_by = x
variable = frac
[]
[]
[Outputs]
[console]
type = Console
execute_on = 'nonlinear linear'
[]
[csv]
type = CSV
sync_times = '0.1 0.5 1'
sync_only = true
[]
time_step_interval = 10
[]
(modules/porous_flow/test/tests/sinks/s13.i)
# Apply a PorousFlowOutflowBC to the right-hand side and watch fluid flow to it
#
# This test has a single phase with two components. The test initialises with
# the porous material fully filled with component=1. The left-hand side is fixed
# at porepressure=1 and mass-fraction of the zeroth component being unity.
# The right-hand side has
# - porepressure fixed at zero via a DirichletBC: physically this removes component=1
# to ensure that porepressure remains fixed
# - a PorousFlowOutflowBC for the component=0 to allow that component to exit the boundary freely
#
# Therefore, the zeroth fluid component will flow from left to right (down the
# pressure gradient).
#
# The important DE is
# porosity * dc/dt = (perm / visc) * grad(P) * grad(c)
# which is true for c = mass-fraction, and very large bulk modulus of the fluid.
# For grad(P) constant in time and space (as in this example) this is just the
# advection equation for c, with velocity = perm / visc / porosity. The parameters
# are chosen to velocity = 1 m/s.
# In the numerical world, and especially with full upwinding, the advection equation
# suffers from diffusion. In this example, the diffusion is obvious when plotting
# the mass-fraction along the line, but the average velocity of the front is still
# correct at 1 m/s.
[Mesh]
type = GeneratedMesh
dim = 1
nx = 100
xmin = 0
xmax = 1
[]
[GlobalParams]
PorousFlowDictator = dictator
gravity = '0 0 0'
[]
[Variables]
[pp]
[]
[frac]
[]
[]
[PorousFlowFullySaturated]
fp = simple_fluid
porepressure = pp
mass_fraction_vars = frac
[]
[ICs]
[pp]
type = FunctionIC
variable = pp
function = 1-x
[]
[]
[FluidProperties]
[simple_fluid]
type = SimpleFluidProperties
bulk_modulus = 1e10 # need large in order for constant-velocity advection
density0 = 1 # irrelevant
thermal_expansion = 0
viscosity = 11
[]
[]
[Materials]
[porosity]
type = PorousFlowPorosityConst
porosity = 0.1
[]
[permeability]
type = PorousFlowPermeabilityConst
permeability = '1.1 0 0 0 1.1 0 0 0 1.1'
[]
[]
[BCs]
[lhs_fixed_b]
type = DirichletBC
boundary = left
variable = pp
value = 1
[]
[rhs_fixed_b]
type = DirichletBC
boundary = right
variable = pp
value = 0
[]
[lhs_fixed_a]
type = DirichletBC
boundary = left
variable = frac
value = 1
[]
[outflow_a]
type = PorousFlowOutflowBC
boundary = right
include_relperm = false # no need for relperm in this fully-saturated simulation
mass_fraction_component = 0
variable = frac
[]
[]
[Preconditioning]
[andy]
type = SMP
full = true
petsc_options_iname = '-pc_type -sub_pc_type -sub_pc_factor_shift_type -pc_asm_overlap'
petsc_options_value = 'asm lu NONZERO 2'
[]
[]
[Executioner]
type = Transient
solve_type = Newton
dt = 1E-2
end_time = 1
nl_rel_tol = 1E-12
nl_abs_tol = 1E-12
[]
[VectorPostprocessors]
[mf]
type = LineValueSampler
start_point = '0 0 0'
end_point = '1 0 0'
num_points = 100
sort_by = x
variable = frac
[]
[]
[Outputs]
[console]
type = Console
execute_on = 'nonlinear linear'
[]
[csv]
type = CSV
sync_times = '0.1 0.5 1'
sync_only = true
[]
time_step_interval = 10
[]
(modules/porous_flow/test/tests/sinks/s13.i)
# Apply a PorousFlowOutflowBC to the right-hand side and watch fluid flow to it
#
# This test has a single phase with two components. The test initialises with
# the porous material fully filled with component=1. The left-hand side is fixed
# at porepressure=1 and mass-fraction of the zeroth component being unity.
# The right-hand side has
# - porepressure fixed at zero via a DirichletBC: physically this removes component=1
# to ensure that porepressure remains fixed
# - a PorousFlowOutflowBC for the component=0 to allow that component to exit the boundary freely
#
# Therefore, the zeroth fluid component will flow from left to right (down the
# pressure gradient).
#
# The important DE is
# porosity * dc/dt = (perm / visc) * grad(P) * grad(c)
# which is true for c = mass-fraction, and very large bulk modulus of the fluid.
# For grad(P) constant in time and space (as in this example) this is just the
# advection equation for c, with velocity = perm / visc / porosity. The parameters
# are chosen to velocity = 1 m/s.
# In the numerical world, and especially with full upwinding, the advection equation
# suffers from diffusion. In this example, the diffusion is obvious when plotting
# the mass-fraction along the line, but the average velocity of the front is still
# correct at 1 m/s.
[Mesh]
type = GeneratedMesh
dim = 1
nx = 100
xmin = 0
xmax = 1
[]
[GlobalParams]
PorousFlowDictator = dictator
gravity = '0 0 0'
[]
[Variables]
[pp]
[]
[frac]
[]
[]
[PorousFlowFullySaturated]
fp = simple_fluid
porepressure = pp
mass_fraction_vars = frac
[]
[ICs]
[pp]
type = FunctionIC
variable = pp
function = 1-x
[]
[]
[FluidProperties]
[simple_fluid]
type = SimpleFluidProperties
bulk_modulus = 1e10 # need large in order for constant-velocity advection
density0 = 1 # irrelevant
thermal_expansion = 0
viscosity = 11
[]
[]
[Materials]
[porosity]
type = PorousFlowPorosityConst
porosity = 0.1
[]
[permeability]
type = PorousFlowPermeabilityConst
permeability = '1.1 0 0 0 1.1 0 0 0 1.1'
[]
[]
[BCs]
[lhs_fixed_b]
type = DirichletBC
boundary = left
variable = pp
value = 1
[]
[rhs_fixed_b]
type = DirichletBC
boundary = right
variable = pp
value = 0
[]
[lhs_fixed_a]
type = DirichletBC
boundary = left
variable = frac
value = 1
[]
[outflow_a]
type = PorousFlowOutflowBC
boundary = right
include_relperm = false # no need for relperm in this fully-saturated simulation
mass_fraction_component = 0
variable = frac
[]
[]
[Preconditioning]
[andy]
type = SMP
full = true
petsc_options_iname = '-pc_type -sub_pc_type -sub_pc_factor_shift_type -pc_asm_overlap'
petsc_options_value = 'asm lu NONZERO 2'
[]
[]
[Executioner]
type = Transient
solve_type = Newton
dt = 1E-2
end_time = 1
nl_rel_tol = 1E-12
nl_abs_tol = 1E-12
[]
[VectorPostprocessors]
[mf]
type = LineValueSampler
start_point = '0 0 0'
end_point = '1 0 0'
num_points = 100
sort_by = x
variable = frac
[]
[]
[Outputs]
[console]
type = Console
execute_on = 'nonlinear linear'
[]
[csv]
type = CSV
sync_times = '0.1 0.5 1'
sync_only = true
[]
time_step_interval = 10
[]
(modules/porous_flow/test/tests/sinks/injection_production_eg_outflowBC.i)
# phase = 0 is liquid phase
# phase = 1 is gas phase
# fluid_component = 0 is water
# fluid_component = 1 is CO2
# Constant rates of water and CO2 injection into the left boundary
# 1D mesh
# The PorousFlowOutflowBCs remove the correct water and CO2 from the right boundary
[Mesh]
type = GeneratedMesh
dim = 1
nx = 20
xmax = 20
[]
[GlobalParams]
PorousFlowDictator = dictator
gravity = '0 0 0'
[]
[AuxVariables]
[saturation_gas]
order = CONSTANT
family = MONOMIAL
[]
[frac_water_in_liquid]
initial_condition = 1.0
[]
[frac_water_in_gas]
initial_condition = 0.0
[]
[water_kg_per_s]
[]
[co2_kg_per_s]
[]
[]
[AuxKernels]
[saturation_gas]
type = PorousFlowPropertyAux
variable = saturation_gas
property = saturation
phase = 1
execute_on = timestep_end
[]
[]
[Variables]
[pwater]
initial_condition = 20E6
[]
[pgas]
initial_condition = 21E6
[]
[]
[Kernels]
[mass0]
type = PorousFlowMassTimeDerivative
fluid_component = 0
variable = pwater
[]
[flux0]
type = PorousFlowAdvectiveFlux
fluid_component = 0
variable = pwater
[]
[mass1]
type = PorousFlowMassTimeDerivative
fluid_component = 1
variable = pgas
[]
[flux1]
type = PorousFlowAdvectiveFlux
fluid_component = 1
variable = pgas
[]
[]
[UserObjects]
[dictator]
type = PorousFlowDictator
porous_flow_vars = 'pgas pwater'
number_fluid_phases = 2
number_fluid_components = 2
[]
[pc]
type = PorousFlowCapillaryPressureVG
alpha = 1E-6
m = 0.6
[]
[]
[FluidProperties]
[true_water]
type = Water97FluidProperties
[]
[tabulated_water]
type = TabulatedBicubicFluidProperties
fp = true_water
temperature_min = 275
pressure_max = 1E8
interpolated_properties = 'density viscosity enthalpy internal_energy'
fluid_property_output_file = water97_tabulated_11.csv
# Comment out the fp parameter and uncomment below to use the newly generated tabulation
# fluid_property_file = water97_tabulated_11.csv
[]
[true_co2]
type = CO2FluidProperties
[]
[tabulated_co2]
type = TabulatedBicubicFluidProperties
fp = true_co2
temperature_min = 275
pressure_max = 1E8
interpolated_properties = 'density viscosity enthalpy internal_energy'
fluid_property_output_file = co2_tabulated_11.csv
# Comment out the fp parameter and uncomment below to use the newly generated tabulation
# fluid_property_file = co2_tabulated_11.csv
[]
[]
[Materials]
[temperature]
type = PorousFlowTemperature
temperature = 293.15
[]
[saturation_calculator]
type = PorousFlow2PhasePP
phase0_porepressure = pwater
phase1_porepressure = pgas
capillary_pressure = pc
[]
[massfrac]
type = PorousFlowMassFraction
mass_fraction_vars = 'frac_water_in_liquid frac_water_in_gas'
[]
[water]
type = PorousFlowSingleComponentFluid
fp = tabulated_water
phase = 0
[]
[co2]
type = PorousFlowSingleComponentFluid
fp = tabulated_co2
phase = 1
[]
[porosity]
type = PorousFlowPorosityConst
porosity = 0.2
[]
[permeability]
type = PorousFlowPermeabilityConst
permeability = '1e-12 0 0 0 1e-12 0 0 0 1e-12'
[]
[relperm_water]
type = PorousFlowRelativePermeabilityCorey
n = 2
phase = 0
s_res = 0.1
sum_s_res = 0.2
[]
[relperm_gas]
type = PorousFlowRelativePermeabilityBC
nw_phase = true
lambda = 2
s_res = 0.1
sum_s_res = 0.2
phase = 1
[]
[]
[BCs]
[water_injection]
type = PorousFlowSink
boundary = left
variable = pwater # pwater is associated with the water mass balance (fluid_component = 0 in its Kernels)
flux_function = -1E-5 # negative means a source, rather than a sink
[]
[co2_injection]
type = PorousFlowSink
boundary = left
variable = pgas # pgas is associated with the CO2 mass balance (fluid_component = 1 in its Kernels)
flux_function = -2E-5 # negative means a source, rather than a sink
[]
[right_water_component0]
type = PorousFlowOutflowBC
boundary = right
variable = pwater
mass_fraction_component = 0
save_in = water_kg_per_s
[]
[right_co2_component1]
type = PorousFlowOutflowBC
boundary = right
variable = pgas
mass_fraction_component = 1
save_in = co2_kg_per_s
[]
[]
[Preconditioning]
active = 'basic'
[basic]
type = SMP
full = true
petsc_options = '-snes_converged_reason -ksp_diagonal_scale -ksp_diagonal_scale_fix -ksp_gmres_modifiedgramschmidt'
petsc_options_iname = '-ksp_type -pc_type -sub_pc_type -sub_pc_factor_shift_type -pc_asm_overlap'
petsc_options_value = 'gmres asm lu NONZERO 2'
[]
[preferred]
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
nl_abs_tol = 1E-10
nl_rel_tol = 1E-10
end_time = 1E5
[TimeStepper]
type = IterationAdaptiveDT
dt = 1E5
growth_factor = 1.1
[]
[]
[Postprocessors]
[water_kg_per_s]
type = NodalSum
boundary = right
variable = water_kg_per_s
[]
[co2_kg_per_s]
type = NodalSum
boundary = right
variable = co2_kg_per_s
[]
[]
[VectorPostprocessors]
[pps]
type = LineValueSampler
start_point = '0 0 0'
end_point = '20 0 0'
num_points = 20
sort_by = x
variable = 'pgas pwater saturation_gas'
[]
[]
[Outputs]
[out]
type = CSV
execute_on = final
[]
[]
(modules/porous_flow/test/tests/sinks/outflow_except2.i)
# Exception testing of PorousFlowOutflowBC. Note that this input file will produce an error message
[Mesh]
type = GeneratedMesh
dim = 1
[]
[GlobalParams]
PorousFlowDictator = dictator
gravity = '0 0 0'
[]
[UserObjects]
[dictator]
type = PorousFlowDictator
number_fluid_components = 1
number_fluid_phases = 1
porous_flow_vars = pp
[]
[]
[Variables]
[pp]
[]
[]
[Kernels]
[dummy]
type = Diffusion
variable = pp
[]
[]
[FluidProperties]
[simple_fluid]
type = SimpleFluidProperties
[]
[]
[Materials]
[ppss]
type = PorousFlow1PhaseFullySaturated
porepressure = pp
[]
[fluid_props]
type = PorousFlowSingleComponentFluid
fp = simple_fluid
phase = 0
[]
[relperm]
type = PorousFlowRelativePermeabilityConst
phase = 0
[]
[massfrac]
type = PorousFlowMassFraction
[]
[temperature]
type = PorousFlowTemperature
temperature = 1
[]
[thermal_conductivity]
type = PorousFlowThermalConductivityIdeal
dry_thermal_conductivity = '1 0 0 0 1 0 0 0 1'
[]
[permeability]
type = PorousFlowPermeabilityConst
permeability = '0.4 0 0 0 0.4 0 0 0 0.4'
[]
[]
[BCs]
[outflow]
type = PorousFlowOutflowBC
boundary = left
variable = pp
[]
[]
[Executioner]
type = Transient
dt = 1
num_steps = 1
[]
(modules/porous_flow/test/tests/sinks/outflow_except1.i)
# Exception testing of PorousFlowOutflowBC. Note that this input file will produce an error message
[Mesh]
type = GeneratedMesh
dim = 1
[]
[GlobalParams]
PorousFlowDictator = dictator
gravity = '0 0 0'
[]
[UserObjects]
[dictator]
type = PorousFlowDictator
number_fluid_components = 1
number_fluid_phases = 1
porous_flow_vars = pp
[]
[]
[Variables]
[pp]
[]
[]
[Kernels]
[dummy]
type = Diffusion
variable = pp
[]
[]
[FluidProperties]
[simple_fluid]
type = SimpleFluidProperties
[]
[]
[Materials]
[ppss]
type = PorousFlow1PhaseFullySaturated
porepressure = pp
[]
[fluid_props]
type = PorousFlowSingleComponentFluid
fp = simple_fluid
phase = 0
[]
[relperm]
type = PorousFlowRelativePermeabilityConst
phase = 0
[]
[massfrac]
type = PorousFlowMassFraction
[]
[temperature]
type = PorousFlowTemperature
temperature = 1
[]
[permeability]
type = PorousFlowPermeabilityConst
permeability = '0.4 0 0 0 0.4 0 0 0 0.4'
[]
[]
[BCs]
[outflow]
type = PorousFlowOutflowBC
boundary = left
variable = pp
mass_fraction_component = 1
[]
[]
[Executioner]
type = Transient
dt = 1
num_steps = 1
[]
(modules/porous_flow/examples/solute_tracer_transport/solute_tracer_transport.i)
# Longitudinal dispersivity
disp = 0.7
[Mesh]
[gen]
type = GeneratedMeshGenerator
dim = 1
nx = 100
xmin = 0
xmax = 100
[]
[]
[GlobalParams]
PorousFlowDictator = dictator
gravity = '0 0 0'
[]
[Variables]
[porepressure]
initial_condition = 1e5
[]
[C]
initial_condition = 0
[]
[]
[AuxVariables]
[Darcy_vel_x]
order = CONSTANT
family = MONOMIAL
[]
[]
[AuxKernels]
[Darcy_vel_x]
type = PorousFlowDarcyVelocityComponent
variable = Darcy_vel_x
component = x
fluid_phase = 0
[]
[]
[UserObjects]
[dictator]
type = PorousFlowDictator
porous_flow_vars = 'porepressure C'
number_fluid_phases = 1
number_fluid_components = 2
[]
[]
[Kernels]
[mass_der_water]
type = PorousFlowMassTimeDerivative
fluid_component = 1
variable = porepressure
[]
[adv_pp]
type = PorousFlowFullySaturatedDarcyFlow
variable = porepressure
fluid_component = 1
[]
[diff_pp]
type = PorousFlowDispersiveFlux
fluid_component = 1
variable = porepressure
disp_trans = 0
disp_long = ${disp}
[]
[mass_der_C]
type = PorousFlowMassTimeDerivative
fluid_component = 0
variable = C
[]
[adv_C]
type = PorousFlowFullySaturatedDarcyFlow
fluid_component = 0
variable = C
[]
[diff_C]
type = PorousFlowDispersiveFlux
fluid_component = 0
variable = C
disp_trans = 0
disp_long = ${disp}
[]
[]
[FluidProperties]
[water]
type = Water97FluidProperties
[]
[]
[Materials]
[ps]
type = PorousFlow1PhaseFullySaturated
porepressure = porepressure
[]
[porosity]
type = PorousFlowPorosityConst
porosity = 0.25
[]
[permeability]
type = PorousFlowPermeabilityConst
permeability = '1E-11 0 0 0 1E-11 0 0 0 1E-11'
[]
[water]
type = PorousFlowSingleComponentFluid
fp = water
phase = 0
[]
[massfrac]
type = PorousFlowMassFraction
mass_fraction_vars = C
[]
[temperature]
type = PorousFlowTemperature
temperature = 293
[]
[diff]
type = PorousFlowDiffusivityConst
diffusion_coeff = '0 0'
tortuosity = 0.1
[]
[relperm]
type = PorousFlowRelativePermeabilityConst
kr = 1
phase = 0
[]
[]
[BCs]
[constant_inlet_pressure]
type = DirichletBC
variable = porepressure
value = 1.2e5
boundary = left
[]
[constant_outlet_porepressure]
type = DirichletBC
variable = porepressure
value = 1e5
boundary = right
[]
[inlet_tracer]
type = DirichletBC
variable = C
value = 0.001
boundary = left
[]
[outlet_tracer]
type = PorousFlowOutflowBC
variable = C
boundary = right
mass_fraction_component = 0
[]
[]
[Preconditioning]
[basic]
type = SMP
full = true
petsc_options_iname = '-pc_type -sub_pc_type -sub_pc_factor_shift_type -pc_asm_overlap'
petsc_options_value = ' asm lu NONZERO 2'
[]
[]
[Executioner]
type = Transient
end_time = 17280000
dtmax = 86400
nl_rel_tol = 1e-6
nl_abs_tol = 1e-12
[TimeStepper]
type = IterationAdaptiveDT
dt = 1000
[]
[]
[Postprocessors]
[C]
type = PointValue
variable = C
point = '50 0 0'
[]
[Darcy_x]
type = PointValue
variable = Darcy_vel_x
point = '50 0 0'
[]
[]
[Outputs]
file_base = solute_tracer_transport_${disp}
csv = true
[]
(modules/porous_flow/test/tests/jacobian/outflowbc03.i)
# PorousFlowOutflowBC: testing Jacobian for single-phase, multi-component, with heat
[Mesh]
[mesh]
type = GeneratedMeshGenerator
dim = 3
[]
[]
[GlobalParams]
PorousFlowDictator = dictator
gravity = '1 2 3'
[]
[Variables]
[pp]
initial_condition = -1
[]
[frac]
initial_condition = 0.4
[]
[T]
[]
[]
[PorousFlowUnsaturated]
coupling_type = ThermoHydro
add_darcy_aux = false
fp = simple_fluid
mass_fraction_vars = frac
porepressure = pp
temperature = T
van_genuchten_alpha = 1
[]
[FluidProperties]
[simple_fluid]
type = SimpleFluidProperties
bulk_modulus = 1.5
density0 = 1.2
cp = 0.9
cv = 1.1
viscosity = 0.4
thermal_expansion = 0.7
[]
[]
[BCs]
[outflow0]
type = PorousFlowOutflowBC
boundary = 'front back top bottom'
variable = frac
mass_fraction_component = 0
multiplier = 1E8 # so this BC gets weighted much more heavily than Kernels
[]
[outflow1]
type = PorousFlowOutflowBC
boundary = 'left right top bottom'
variable = pp
mass_fraction_component = 1
multiplier = 1E8 # so this BC gets weighted much more heavily than Kernels
[]
[outflowT]
type = PorousFlowOutflowBC
boundary = 'left right top bottom'
flux_type = heat
variable = T
multiplier = 1E8 # so this BC gets weighted much more heavily than Kernels
[]
[]
[Materials]
[porosity]
type = PorousFlowPorosityConst
porosity = 0.4
[]
[permeability]
type = PorousFlowPermeabilityConst
permeability = '0.1 0.2 0.3 1.8 0.9 1.7 0.4 0.3 1.1'
[]
[matrix_energy]
type = PorousFlowMatrixInternalEnergy
density = 0.5
specific_heat_capacity = 2.2E-3
[]
[thermal_conductivity]
type = PorousFlowThermalConductivityIdeal
dry_thermal_conductivity = '1.1 1.2 1.3 0.8 0.9 0.7 0.4 0.3 0.1'
wet_thermal_conductivity = '0.1 0.2 0.3 1.8 1.9 1.7 1.4 1.3 1.1'
[]
[]
[Preconditioning]
[andy]
type = SMP
full = true
[]
[]
[Executioner]
type = Transient
solve_type = NEWTON
dt = 1E-7
num_steps = 1
# petsc_options = '-snes_test_jacobian -snes_force_iteration'
# petsc_options_iname = '-snes_type --ksp_type -pc_type -snes_convergence_test'
# petsc_options_value = ' ksponly preonly none skip'
[]
(modules/porous_flow/examples/solute_tracer_transport/solute_tracer_transport_2D.i)
# Longitudinal dispersivity
disp = 5
[Mesh]
[gen]
type = GeneratedMeshGenerator
dim = 2
nx = 100
xmin = -50
xmax = 50
ny = 60
ymin = 0
ymax = 50
[]
[]
[GlobalParams]
PorousFlowDictator = dictator
gravity = '0 0 0'
[]
[Variables]
[porepressure]
initial_condition = 1e5
[]
[C]
initial_condition = 0
[]
[]
[AuxVariables]
[Darcy_vel_x]
order = CONSTANT
family = MONOMIAL
[]
[Darcy_vel_y]
order = CONSTANT
family = MONOMIAL
[]
[]
[AuxKernels]
[Darcy_vel_x]
type = PorousFlowDarcyVelocityComponent
variable = Darcy_vel_x
component = x
fluid_phase = 0
[]
[Darcy_vel_y]
type = PorousFlowDarcyVelocityComponent
variable = Darcy_vel_y
component = y
fluid_phase = 0
[]
[]
[UserObjects]
[dictator]
type = PorousFlowDictator
porous_flow_vars = 'porepressure C'
number_fluid_phases = 1
number_fluid_components = 2
[]
[]
[Kernels]
[mass_der_water]
type = PorousFlowMassTimeDerivative
fluid_component = 1
variable = porepressure
[]
[adv_pp]
type = PorousFlowFullySaturatedDarcyFlow
variable = porepressure
fluid_component = 1
[]
[diff_pp]
type = PorousFlowDispersiveFlux
fluid_component = 1
variable = porepressure
disp_trans = 0
disp_long = ${disp}
[]
[mass_der_C]
type = PorousFlowMassTimeDerivative
fluid_component = 0
variable = C
[]
[adv_C]
type = PorousFlowFullySaturatedDarcyFlow
fluid_component = 0
variable = C
[]
[diff_C]
type = PorousFlowDispersiveFlux
fluid_component = 0
variable = C
disp_trans = 0
disp_long = ${disp}
[]
[]
[FluidProperties]
[water]
type = Water97FluidProperties
[]
[]
[Materials]
[ps]
type = PorousFlow1PhaseFullySaturated
porepressure = porepressure
[]
[porosity]
type = PorousFlowPorosityConst
porosity = 0.25
[]
[permeability]
type = PorousFlowPermeabilityConst
permeability = '1E-11 0 0 0 1E-11 0 0 0 1E-11'
[]
[water]
type = PorousFlowSingleComponentFluid
fp = water
phase = 0
[]
[massfrac]
type = PorousFlowMassFraction
mass_fraction_vars = C
[]
[temperature]
type = PorousFlowTemperature
temperature = 293
[]
[diff]
type = PorousFlowDiffusivityConst
diffusion_coeff = '0 0'
tortuosity = 0.1
[]
[relperm]
type = PorousFlowRelativePermeabilityConst
kr = 1
phase = 0
[]
[]
[DiracKernels]
[source_P]
type = PorousFlowSquarePulsePointSource
point = '0 0 0'
mass_flux = 1e-1
variable = porepressure
[]
[source_C]
type = PorousFlowSquarePulsePointSource
point = '0 0 0'
mass_flux = 1e-7
variable = C
[]
[]
[BCs]
[constant_outlet_porepressure_]
type = DirichletBC
variable = porepressure
value = 1e5
boundary = 'top left right'
[]
[outlet_tracer_top]
type = PorousFlowOutflowBC
variable = C
boundary = top
mass_fraction_component = 0
[]
[outlet_tracer_right]
type = PorousFlowOutflowBC
variable = C
boundary = right
mass_fraction_component = 0
[]
[outlet_tracer_left]
type = PorousFlowOutflowBC
variable = C
boundary = left
mass_fraction_component = 0
[]
[]
[Preconditioning]
[basic]
type = SMP
full = true
petsc_options_iname = '-pc_type -sub_pc_type -sub_pc_factor_shift_type -pc_asm_overlap'
petsc_options_value = ' asm lu NONZERO 2'
[]
[]
[Executioner]
type = Transient
end_time = 17280000
dtmax = 100000
nl_rel_tol = 1e-6
nl_abs_tol = 1e-12
[TimeStepper]
type = IterationAdaptiveDT
dt = 1000
[]
[]
[Postprocessors]
[C]
type = PointValue
variable = C
point = '0 25 0'
[]
[Darcy_x]
type = PointValue
variable = Darcy_vel_x
point = '0 25 0'
[]
[Darcy_y]
type = PointValue
variable = Darcy_vel_y
point = '0 25 0'
[]
[]
[Outputs]
file_base = solute_tracer_transport_2D_${disp}
csv = true
exodus = true
[]
(modules/porous_flow/test/tests/jacobian/outflowbc04.i)
# PorousFlowOutflowBC: testing Jacobian for multi-phase, multi-component
[Mesh]
[mesh]
type = GeneratedMeshGenerator
dim = 3
[]
[]
[GlobalParams]
PorousFlowDictator = dictator
gravity = '1 2 3'
[]
[Variables]
[pwater]
initial_condition = 1
[]
[pgas]
initial_condition = 2
[]
[]
[Kernels]
[mass0]
type = PorousFlowMassTimeDerivative
fluid_component = 0
variable = pwater
[]
[flux0]
type = PorousFlowAdvectiveFlux
fluid_component = 0
variable = pwater
[]
[mass1]
type = PorousFlowMassTimeDerivative
fluid_component = 1
variable = pgas
[]
[flux1]
type = PorousFlowAdvectiveFlux
fluid_component = 1
variable = pgas
[]
[]
[AuxVariables]
[frac_water_in_liquid]
initial_condition = 0.6
[]
[frac_water_in_gas]
initial_condition = 0.4
[]
[]
[UserObjects]
[dictator]
type = PorousFlowDictator
porous_flow_vars = 'pgas pwater'
number_fluid_phases = 2
number_fluid_components = 2
[]
[pc]
type = PorousFlowCapillaryPressureVG
alpha = 1
m = 0.6
[]
[]
[FluidProperties]
[simple_fluid0]
type = SimpleFluidProperties
bulk_modulus = 1.5
density0 = 1.2
cp = 0.9
cv = 1.1
viscosity = 0.4
thermal_expansion = 0.7
[]
[simple_fluid1]
type = SimpleFluidProperties
bulk_modulus = 2.5
density0 = 0.5
cp = 1.9
cv = 2.1
viscosity = 0.9
thermal_expansion = 0.4
[]
[]
[Materials]
[temperature]
type = PorousFlowTemperature
temperature = 0
[]
[saturation_calculator]
type = PorousFlow2PhasePP
phase0_porepressure = pwater
phase1_porepressure = pgas
capillary_pressure = pc
[]
[massfrac]
type = PorousFlowMassFraction
mass_fraction_vars = 'frac_water_in_liquid frac_water_in_gas'
[]
[water]
type = PorousFlowSingleComponentFluid
fp = simple_fluid0
phase = 0
[]
[co2]
type = PorousFlowSingleComponentFluid
fp = simple_fluid1
phase = 1
[]
[porosity]
type = PorousFlowPorosityConst
porosity = 0.2
[]
[permeability]
type = PorousFlowPermeabilityConst
permeability = '0.1 0.2 0.3 1.8 0.9 1.7 0.4 0.3 1.1'
[]
[relperm_water]
type = PorousFlowRelativePermeabilityCorey
n = 2
phase = 0
s_res = 0.0
sum_s_res = 0.0
[]
[relperm_gas]
type = PorousFlowRelativePermeabilityBC
nw_phase = true
lambda = 2
s_res = 0.0
sum_s_res = 0.0
phase = 1
[]
[]
[BCs]
[outflow0]
type = PorousFlowOutflowBC
boundary = 'front back top bottom'
variable = pwater
mass_fraction_component = 0
multiplier = 1E8 # so this BC gets weighted much more heavily than Kernels
[]
[outflow1]
type = PorousFlowOutflowBC
boundary = 'left right top bottom'
variable = pgas
mass_fraction_component = 1
multiplier = 1E8 # so this BC gets weighted much more heavily than Kernels
[]
[]
[Preconditioning]
[andy]
type = SMP
full = true
[]
[]
[Executioner]
type = Transient
solve_type = NEWTON
dt = 1E-7
num_steps = 1
# petsc_options = '-snes_test_jacobian -snes_force_iteration'
# petsc_options_iname = '-snes_type --ksp_type -pc_type -snes_convergence_test'
# petsc_options_value = ' ksponly preonly none skip'
[]
(modules/porous_flow/test/tests/jacobian/outflowbc01.i)
# PorousFlowOutflowBC: testing Jacobian for single-phase, single-component, no heat
[Mesh]
[mesh]
type = GeneratedMeshGenerator
dim = 3
[]
[]
[GlobalParams]
PorousFlowDictator = dictator
gravity = '1 2 3'
[]
[Variables]
[pp]
[]
[]
[PorousFlowFullySaturated]
add_darcy_aux = false
fp = simple_fluid
porepressure = pp
[]
[FluidProperties]
[simple_fluid]
type = SimpleFluidProperties
bulk_modulus = 1.5
density0 = 1.2
viscosity = 0.4
[]
[]
[BCs]
[outflow0]
type = PorousFlowOutflowBC
boundary = 'front back top bottom front back'
variable = pp
multiplier = 1E8 # so this BC gets weighted much more heavily than Kernels
[]
[]
[Materials]
[porosity]
type = PorousFlowPorosityConst
porosity = 0.4
[]
[permeability]
type = PorousFlowPermeabilityConst
permeability = '0.1 0.2 0.3 1.8 0.9 1.7 0.4 0.3 1.1'
[]
[]
[Preconditioning]
[andy]
type = SMP
full = true
[]
[]
[Executioner]
type = Transient
solve_type = NEWTON
dt = 1E-7
num_steps = 1
# petsc_options = '-snes_test_jacobian -snes_force_iteration'
# petsc_options_iname = '-snes_type --ksp_type -pc_type -snes_convergence_test'
# petsc_options_value = ' ksponly preonly none skip'
[]
(modules/porous_flow/test/tests/sinks/s15.i)
# Apply a PorousFlowPointSourceFromPostprocessor that injects 1J/s into a 2D model, and PorousFlowOutflowBCs to the outer boundaries to show that the PorousFlowOutflowBCs allow heat-energy to exit freely at the appropriate rate
[Mesh]
type = GeneratedMesh
dim = 2
nx = 3
xmin = -1
xmax = 1
ny = 2
ymin = -2
ymax = 2
[]
[GlobalParams]
PorousFlowDictator = dictator
gravity = '0 0 0'
[]
[Variables]
[pp]
[]
[T]
scaling = 1E-7
[]
[]
[PorousFlowFullySaturated]
fp = simple_fluid
coupling_type = thermohydro
porepressure = pp
temperature = T
[]
[DiracKernels]
[injection]
type = PorousFlowPointSourceFromPostprocessor
mass_flux = 1
point = '0 0 0'
variable = T
[]
[]
[FluidProperties]
[simple_fluid]
type = SimpleFluidProperties
bulk_modulus = 1
[]
[]
[Materials]
[porosity]
type = PorousFlowPorosityConst
porosity = 0.12
[]
[permeability]
type = PorousFlowPermeabilityConst
permeability = '0.4 0 0 0 0.4 0 0 0 0.4'
[]
[matrix]
type = PorousFlowMatrixInternalEnergy
density = 0.15
specific_heat_capacity = 1.5
[]
[thermal_cond]
type = PorousFlowThermalConductivityIdeal
dry_thermal_conductivity = '0.3 0 0 0 0.3 0 0 0 0.3'
[]
[]
[BCs]
[outflow]
type = PorousFlowOutflowBC
boundary = 'left right top bottom'
flux_type = heat
variable = T
save_in = nodal_outflow
[]
[]
[AuxVariables]
[nodal_outflow]
[]
[]
[Postprocessors]
[outflow_J_per_s]
type = NodalSum
boundary = 'left right top bottom'
variable = nodal_outflow
[]
[]
[Preconditioning]
[andy]
type = SMP
full = true
[]
[]
[Executioner]
type = Transient
solve_type = Newton
dt = 2E6
end_time = 2E7
nl_abs_tol = 1E-14
# nl_rel_tol = 1E-12
[]
[Outputs]
csv = true
[]
(modules/porous_flow/test/tests/jacobian/outflowbc02.i)
# PorousFlowOutflowBC: testing Jacobian for single-phase, single-component, with heat
[Mesh]
[mesh]
type = GeneratedMeshGenerator
dim = 3
[]
[]
[GlobalParams]
PorousFlowDictator = dictator
gravity = '1 2 3'
[]
[Variables]
[pp]
[]
[T]
[]
[]
[PorousFlowFullySaturated]
coupling_type = thermohydro
add_darcy_aux = false
fp = simple_fluid
porepressure = pp
temperature = T
[]
[FluidProperties]
[simple_fluid]
type = SimpleFluidProperties
bulk_modulus = 1.5
density0 = 1.2
cp = 0.9
cv = 1.1
viscosity = 0.4
thermal_expansion = 0.7
[]
[]
[BCs]
[outflow0]
type = PorousFlowOutflowBC
boundary = 'front back top bottom front back'
variable = pp
multiplier = 1E8 # so this BC gets weighted much more heavily than Kernels
[]
[outflowT]
type = PorousFlowOutflowBC
boundary = 'front back top bottom front back'
flux_type = heat
variable = T
multiplier = 1E8 # so this BC gets weighted much more heavily than Kernels
[]
[]
[Materials]
[porosity]
type = PorousFlowPorosityConst
porosity = 0.4
[]
[permeability]
type = PorousFlowPermeabilityConst
permeability = '0.1 0.2 0.3 1.8 0.9 1.7 0.4 0.3 1.1'
[]
[matrix_energy]
type = PorousFlowMatrixInternalEnergy
density = 0.5
specific_heat_capacity = 2.2E-3
[]
[thermal_conductivity]
type = PorousFlowThermalConductivityIdeal
dry_thermal_conductivity = '1.1 1.2 1.3 0.8 0.9 0.7 0.4 0.3 0.1'
wet_thermal_conductivity = '0.1 0.2 0.3 1.8 1.9 1.7 1.4 1.3 1.1'
[]
[]
[Preconditioning]
[andy]
type = SMP
full = true
[]
[]
[Executioner]
type = Transient
solve_type = NEWTON
dt = 1E-7
num_steps = 1
# petsc_options = '-snes_test_jacobian -snes_force_iteration'
# petsc_options_iname = '-snes_type --ksp_type -pc_type -snes_convergence_test'
# petsc_options_value = ' ksponly preonly none skip'
[]
(modules/porous_flow/test/tests/sinks/s14.i)
# Apply a PorousFlowPointSourceFromPostprocessor that injects 1kg/s into a 2D model, and PorousFlowOutflowBCs to the outer boundaries to show that the PorousFlowOutflowBCs allow fluid to exit freely at the appropriate rate
[Mesh]
type = GeneratedMesh
dim = 2
nx = 3
xmin = -1
xmax = 1
ny = 2
ymin = -2
ymax = 2
[]
[GlobalParams]
PorousFlowDictator = dictator
gravity = '0 0 0'
[]
[Variables]
[pp]
[]
[]
[PorousFlowFullySaturated]
fp = simple_fluid
porepressure = pp
[]
[DiracKernels]
[injection]
type = PorousFlowPointSourceFromPostprocessor
mass_flux = 1
point = '0 0 0'
variable = pp
[]
[]
[FluidProperties]
[simple_fluid]
type = SimpleFluidProperties
bulk_modulus = 1
[]
[]
[Materials]
[porosity]
type = PorousFlowPorosityConst
porosity = 0.12
[]
[permeability]
type = PorousFlowPermeabilityConst
permeability = '0.4 0 0 0 0.4 0 0 0 0.4'
[]
[]
[BCs]
[outflow]
type = PorousFlowOutflowBC
boundary = 'left right top bottom'
variable = pp
save_in = nodal_outflow
[]
[]
[AuxVariables]
[nodal_outflow]
[]
[]
[Postprocessors]
[outflow_kg_per_s]
type = NodalSum
boundary = 'left right top bottom'
variable = nodal_outflow
[]
[]
[Preconditioning]
[andy]
type = SMP
full = true
[]
[]
[Executioner]
type = Transient
solve_type = Newton
dt = 3E-4
end_time = 30E-4
nl_abs_tol = 1E-9
nl_rel_tol = 1E-9
[]
[Outputs]
csv = true
[]