Heat energy produced by plastic deformation
In PorousFlow, it is assumed that plastic deformation causes a heat energy-density rate (J.m.s) of where is a coefficient (s), is the porosity, is the stress, and is the plastic strain. This is implemented in the PorousFlowPlasticHeatEnergy Kernel
In the set of simple tests described below, the porous skeleton contains no fluid, and no heat flow is considered, so the heat energy released simply heats up the porous skeleton: The porosity () and volumetric heat capacity of the rock grains () are chosen to be constant.
Perfect, capped, weak-plane plasticity is used, so that the admissible zone is defined by Here is the tensile strength, is the compressive strength, is the cohesion and is the friction angle. The elastic tensor is chosen to be isotropic The parameters in these expressions are chosen to be: , , , , , and (all in consistent units).
In each experiment a single finite-element of unit size is used.
Tensile failure
The top of the finite element is pulled upwards with displacement: while the displacement on the element's bottom, and in the and directions is chosen to be zero.
# Tensile heating, using capped weak-plane plasticity
# z_disp(z=1) = t
# totalstrain_zz = t
# with C_ijkl = 0.5 0.25
# stress_zz = t, but with tensile_strength = 1, stress_zz = min(t, 1)
# so plasticstrain_zz = t - 1
# heat_energy_rate = coeff * (t - 1)
# Heat capacity of rock = specific_heat_cap * density = 4
# So temperature of rock should be:
# (1 - porosity) * 4 * T = (1 - porosity) * coeff * (t - 1)
[Mesh<<<{"href": "../../../../syntax/Mesh/index.html"}>>>]
type = GeneratedMesh
dim = 3
xmin = -10
xmax = 10
zmin = 0
zmax = 1
[]
[GlobalParams<<<{"href": "../../../../syntax/GlobalParams/index.html"}>>>]
displacements = 'disp_x disp_y disp_z'
PorousFlowDictator = dictator
[]
[Variables<<<{"href": "../../../../syntax/Variables/index.html"}>>>]
[temperature]
[]
[]
[Kernels<<<{"href": "../../../../syntax/Kernels/index.html"}>>>]
[energy_dot]
type = PorousFlowEnergyTimeDerivative<<<{"description": "Derivative of heat-energy-density wrt time", "href": "../../../../source/kernels/PorousFlowEnergyTimeDerivative.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = temperature
base_name<<<{"description": "For mechanically-coupled systems, this Kernel will depend on the volumetric strain. base_name should almost always be the same base_name as given to the TensorMechanics object that computes strain. Supplying a base_name to this Kernel but not defining an associated TensorMechanics strain calculator means that this Kernel will not depend on volumetric strain. That could be useful when models contain solid mechanics that is not coupled to porous flow, for example"}>>> = non_existent
[]
[phe]
type = PorousFlowPlasticHeatEnergy<<<{"description": "Plastic heat energy density source = (1 - porosity) * coeff * stress * plastic_strain_rate", "href": "../../../../source/kernels/PorousFlowPlasticHeatEnergy.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = temperature
[]
[]
[AuxVariables<<<{"href": "../../../../syntax/AuxVariables/index.html"}>>>]
[disp_x]
[]
[disp_y]
[]
[disp_z]
[]
[]
[AuxKernels<<<{"href": "../../../../syntax/AuxKernels/index.html"}>>>]
[disp_z]
type = FunctionAux<<<{"description": "Auxiliary Kernel that creates and updates a field variable by sampling a function through space and time.", "href": "../../../../source/auxkernels/FunctionAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = disp_z
function<<<{"description": "The function to use as the value"}>>> = z*t
[]
[]
[UserObjects<<<{"href": "../../../../syntax/UserObjects/index.html"}>>>]
[dictator]
type = PorousFlowDictator<<<{"description": "Holds information on the PorousFlow variable names", "href": "../../../../source/userobjects/PorousFlowDictator.html"}>>>
porous_flow_vars<<<{"description": "List of primary variables that are used in the PorousFlow simulation. Jacobian entries involving derivatives wrt these variables will be computed. In single-phase models you will just have one (eg 'pressure'), in two-phase models you will have two (eg 'p_water p_gas', or 'p_water s_water'), etc."}>>> = temperature
number_fluid_phases<<<{"description": "The number of fluid phases in the simulation"}>>> = 0
number_fluid_components<<<{"description": "The number of fluid components in the simulation"}>>> = 0
[]
[coh]
type = TensorMechanicsHardeningConstant<<<{"description": "No hardening - the parameter is independent of the internal parameter(s)", "href": "../../../../source/userobjects/SolidMechanicsHardeningConstant.html"}>>>
value<<<{"description": "The value of the parameter for all internal parameter. This is perfect plasticity - there is no hardening."}>>> = 100
[]
[tanphi]
type = TensorMechanicsHardeningConstant<<<{"description": "No hardening - the parameter is independent of the internal parameter(s)", "href": "../../../../source/userobjects/SolidMechanicsHardeningConstant.html"}>>>
value<<<{"description": "The value of the parameter for all internal parameter. This is perfect plasticity - there is no hardening."}>>> = 1.0
[]
[t_strength]
type = TensorMechanicsHardeningConstant<<<{"description": "No hardening - the parameter is independent of the internal parameter(s)", "href": "../../../../source/userobjects/SolidMechanicsHardeningConstant.html"}>>>
value<<<{"description": "The value of the parameter for all internal parameter. This is perfect plasticity - there is no hardening."}>>> = 1
[]
[c_strength]
type = TensorMechanicsHardeningConstant<<<{"description": "No hardening - the parameter is independent of the internal parameter(s)", "href": "../../../../source/userobjects/SolidMechanicsHardeningConstant.html"}>>>
value<<<{"description": "The value of the parameter for all internal parameter. This is perfect plasticity - there is no hardening."}>>> = 1
[]
[]
[Materials<<<{"href": "../../../../syntax/Materials/index.html"}>>>]
[rock_internal_energy]
type = PorousFlowMatrixInternalEnergy<<<{"description": "This Material calculates the internal energy of solid rock grains, which is specific_heat_capacity * density * temperature. Kernels multiply this by (1 - porosity) to find the energy density of the porous rock in a rock-fluid system", "href": "../../../../source/materials/PorousFlowMatrixInternalEnergy.html"}>>>
specific_heat_capacity<<<{"description": "Specific heat capacity of the rock grains (J/kg/K)."}>>> = 2
density<<<{"description": "Density of the rock grains"}>>> = 2
[]
[temp]
type = PorousFlowTemperature<<<{"description": "Material to provide temperature at the quadpoints or nodes and derivatives of it with respect to the PorousFlow variables", "href": "../../../../source/materials/PorousFlowTemperature.html"}>>>
temperature<<<{"description": "Fluid temperature variable. Note, the default is suitable if your simulation is using Kelvin units, but probably not for Celsius"}>>> = temperature
[]
[porosity]
type = PorousFlowPorosityConst<<<{"description": "This Material calculates the porosity assuming it is constant", "href": "../../../../source/materials/PorousFlowPorosityConst.html"}>>>
porosity<<<{"description": "The porosity (assumed indepenent of porepressure, temperature, strain, etc, for this material). This should be a real number, or a constant monomial variable (not a linear lagrange or other kind of variable)."}>>> = 0.2
[]
[phe]
type = ComputePlasticHeatEnergy<<<{"description": "Plastic heat energy density = stress * plastic_strain_rate", "href": "../../../../source/materials/ComputePlasticHeatEnergy.html"}>>>
[]
[elasticity_tensor]
type = ComputeElasticityTensor<<<{"description": "Compute an elasticity tensor.", "href": "../../../../source/materials/ComputeElasticityTensor.html"}>>>
fill_method<<<{"description": "The fill method"}>>> = symmetric_isotropic
C_ijkl<<<{"description": "Stiffness tensor for material"}>>> = '0.5 0.25'
[]
[strain]
type = ComputeIncrementalStrain<<<{"description": "Compute a strain increment and rotation increment for small strains.", "href": "../../../../source/materials/ComputeIncrementalStrain.html"}>>>
displacements<<<{"description": "The displacements appropriate for the simulation geometry and coordinate system"}>>> = 'disp_x disp_y disp_z'
[]
[admissible]
type = ComputeMultipleInelasticStress<<<{"description": "Compute state (stress and internal parameters such as plastic strains and internal parameters) using an iterative process. Combinations of creep models and plastic models may be used.", "href": "../../../../source/materials/ComputeMultipleInelasticStress.html"}>>>
inelastic_models<<<{"description": "The material objects to use to calculate stress and inelastic strains. Note: specify creep models first and plasticity models second."}>>> = mc
perform_finite_strain_rotations<<<{"description": "Tensors are correctly rotated in finite-strain simulations. For optimal performance you can set this to 'false' if you are only ever using small strains"}>>> = false
[]
[mc]
type = CappedWeakPlaneStressUpdate<<<{"description": "Capped weak-plane plasticity stress calculator", "href": "../../../../source/materials/CappedWeakPlaneStressUpdate.html"}>>>
cohesion<<<{"description": "A SolidMechanicsHardening UserObject that defines hardening of the cohesion. Physically the cohesion should not be negative."}>>> = coh
tan_friction_angle<<<{"description": "A SolidMechanicsHardening UserObject that defines hardening of tan(friction angle). Physically the friction angle should be between 0 and 90deg."}>>> = tanphi
tan_dilation_angle<<<{"description": "A SolidMechanicsHardening UserObject that defines hardening of the tan(dilation angle). Usually the dilation angle is not greater than the friction angle, and it is between 0 and 90deg."}>>> = tanphi
tensile_strength<<<{"description": "A SolidMechanicsHardening UserObject that defines hardening of the weak-plane tensile strength. In physical situations this is positive (and always must be greater than negative compressive-strength."}>>> = t_strength
compressive_strength<<<{"description": "A SolidMechanicsHardening UserObject that defines hardening of the weak-plane compressive strength. In physical situations this is positive."}>>> = c_strength
tip_smoother<<<{"description": "The cone vertex at shear-stress = 0 will be smoothed by the given amount. Typical value is 0.1*cohesion"}>>> = 0
smoothing_tol<<<{"description": "Intersections of the yield surfaces will be smoothed by this amount (this is measured in units of stress). Often this is related to other physical parameters (eg, 0.1*cohesion) but it is important to set this small enough so that the individual yield surfaces do not mix together in the smoothing process to produce a result where no stress is admissible (for example, mixing together tensile and compressive failure envelopes)."}>>> = 1
yield_function_tol<<<{"description": "The return-map process will be deemed to have converged if all yield functions are within yield_function_tol of zero. If this is set very low then precision-loss might be encountered: if the code detects precision loss then it also deems the return-map process has converged."}>>> = 1E-10
perfect_guess<<<{"description": "Provide a guess to the Newton-Raphson procedure that is the result from perfect plasticity. With severe hardening/softening this may be suboptimal."}>>> = true
[]
[]
[Postprocessors<<<{"href": "../../../../syntax/Postprocessors/index.html"}>>>]
[temp]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../../source/postprocessors/PointValue.html"}>>>
point<<<{"description": "The physical point where the solution will be evaluated."}>>> = '0 0 0'
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = temperature
[]
[]
[Preconditioning<<<{"href": "../../../../syntax/Preconditioning/index.html"}>>>]
[andy]
type = SMP<<<{"description": "Single matrix preconditioner (SMP) builds a preconditioner using user defined off-diagonal parts of the Jacobian.", "href": "../../../../source/preconditioners/SingleMatrixPreconditioner.html"}>>>
full<<<{"description": "Set to true if you want the full set of couplings between variables simply for convenience so you don't have to set every off_diag_row and off_diag_column combination."}>>> = true
petsc_options_iname<<<{"description": "Names of PETSc name/value pairs"}>>> = '-ksp_type -pc_type -snes_atol -snes_rtol -snes_max_it'
petsc_options_value<<<{"description": "Values of PETSc name/value pairs (must correspond with \"petsc_options_iname\""}>>> = 'bcgs bjacobi 1E-15 1E-10 10000'
[]
[]
[Executioner<<<{"href": "../../../../syntax/Executioner/index.html"}>>>]
type = Transient
solve_type = Newton
dt = 1
end_time = 10
[]
[Outputs<<<{"href": "../../../../syntax/Outputs/index.html"}>>>]
file_base<<<{"description": "Common file base name to be utilized with all output objects"}>>> = tensile01
csv<<<{"description": "Output the scalar variable and postprocessors to a *.csv file using the default CSV output."}>>> = true
[]
(moose/modules/porous_flow/test/tests/plastic_heating/tensile01.i)This implies the only non-zero component of total strain is The constitutive law implies This stress is admissible for , while for the system yields in tension: and the plastic strain is, This means that the material's temperature should increase as with no temperature increase for .
This result is reproduced exactly by PorousFlow.
Compressive failure
The top of the finite element is pushed downwards with displacement: while the displacement on the element's bottom, and in the and directions is chosen to be zero.
# Tensile heating, using capped weak-plane plasticity
# z_disp(z=1) = -t
# totalstrain_zz = -t
# with C_ijkl = 0.5 0.25
# stress_zz = -t, but with compressive_strength = 1, stress_zz = max(-t, -1)
# so plasticstrain_zz = -(t - 1)
# heat_energy_rate = coeff * (t - 1)
# Heat capacity of rock = specific_heat_cap * density = 4
# So temperature of rock should be:
# (1 - porosity) * 4 * T = (1 - porosity) * coeff * (t - 1)
[Mesh<<<{"href": "../../../../syntax/Mesh/index.html"}>>>]
type = GeneratedMesh
dim = 3
xmin = -10
xmax = 10
zmin = 0
zmax = 1
[]
[GlobalParams<<<{"href": "../../../../syntax/GlobalParams/index.html"}>>>]
displacements = 'disp_x disp_y disp_z'
PorousFlowDictator = dictator
[]
[Variables<<<{"href": "../../../../syntax/Variables/index.html"}>>>]
[temperature]
[]
[]
[Kernels<<<{"href": "../../../../syntax/Kernels/index.html"}>>>]
[energy_dot]
type = PorousFlowEnergyTimeDerivative<<<{"description": "Derivative of heat-energy-density wrt time", "href": "../../../../source/kernels/PorousFlowEnergyTimeDerivative.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = temperature
base_name<<<{"description": "For mechanically-coupled systems, this Kernel will depend on the volumetric strain. base_name should almost always be the same base_name as given to the TensorMechanics object that computes strain. Supplying a base_name to this Kernel but not defining an associated TensorMechanics strain calculator means that this Kernel will not depend on volumetric strain. That could be useful when models contain solid mechanics that is not coupled to porous flow, for example"}>>> = non_existent
[]
[phe]
type = PorousFlowPlasticHeatEnergy<<<{"description": "Plastic heat energy density source = (1 - porosity) * coeff * stress * plastic_strain_rate", "href": "../../../../source/kernels/PorousFlowPlasticHeatEnergy.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = temperature
[]
[]
[AuxVariables<<<{"href": "../../../../syntax/AuxVariables/index.html"}>>>]
[disp_x]
[]
[disp_y]
[]
[disp_z]
[]
[]
[AuxKernels<<<{"href": "../../../../syntax/AuxKernels/index.html"}>>>]
[disp_z]
type = FunctionAux<<<{"description": "Auxiliary Kernel that creates and updates a field variable by sampling a function through space and time.", "href": "../../../../source/auxkernels/FunctionAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = disp_z
function<<<{"description": "The function to use as the value"}>>> = '-z*t'
[]
[]
[UserObjects<<<{"href": "../../../../syntax/UserObjects/index.html"}>>>]
[dictator]
type = PorousFlowDictator<<<{"description": "Holds information on the PorousFlow variable names", "href": "../../../../source/userobjects/PorousFlowDictator.html"}>>>
porous_flow_vars<<<{"description": "List of primary variables that are used in the PorousFlow simulation. Jacobian entries involving derivatives wrt these variables will be computed. In single-phase models you will just have one (eg 'pressure'), in two-phase models you will have two (eg 'p_water p_gas', or 'p_water s_water'), etc."}>>> = temperature
number_fluid_phases<<<{"description": "The number of fluid phases in the simulation"}>>> = 0
number_fluid_components<<<{"description": "The number of fluid components in the simulation"}>>> = 0
[]
[coh]
type = TensorMechanicsHardeningConstant<<<{"description": "No hardening - the parameter is independent of the internal parameter(s)", "href": "../../../../source/userobjects/SolidMechanicsHardeningConstant.html"}>>>
value<<<{"description": "The value of the parameter for all internal parameter. This is perfect plasticity - there is no hardening."}>>> = 100
[]
[tanphi]
type = TensorMechanicsHardeningConstant<<<{"description": "No hardening - the parameter is independent of the internal parameter(s)", "href": "../../../../source/userobjects/SolidMechanicsHardeningConstant.html"}>>>
value<<<{"description": "The value of the parameter for all internal parameter. This is perfect plasticity - there is no hardening."}>>> = 1.0
[]
[t_strength]
type = TensorMechanicsHardeningConstant<<<{"description": "No hardening - the parameter is independent of the internal parameter(s)", "href": "../../../../source/userobjects/SolidMechanicsHardeningConstant.html"}>>>
value<<<{"description": "The value of the parameter for all internal parameter. This is perfect plasticity - there is no hardening."}>>> = 1
[]
[c_strength]
type = TensorMechanicsHardeningConstant<<<{"description": "No hardening - the parameter is independent of the internal parameter(s)", "href": "../../../../source/userobjects/SolidMechanicsHardeningConstant.html"}>>>
value<<<{"description": "The value of the parameter for all internal parameter. This is perfect plasticity - there is no hardening."}>>> = 1
[]
[]
[Materials<<<{"href": "../../../../syntax/Materials/index.html"}>>>]
[rock_internal_energy]
type = PorousFlowMatrixInternalEnergy<<<{"description": "This Material calculates the internal energy of solid rock grains, which is specific_heat_capacity * density * temperature. Kernels multiply this by (1 - porosity) to find the energy density of the porous rock in a rock-fluid system", "href": "../../../../source/materials/PorousFlowMatrixInternalEnergy.html"}>>>
specific_heat_capacity<<<{"description": "Specific heat capacity of the rock grains (J/kg/K)."}>>> = 2
density<<<{"description": "Density of the rock grains"}>>> = 2
[]
[temp]
type = PorousFlowTemperature<<<{"description": "Material to provide temperature at the quadpoints or nodes and derivatives of it with respect to the PorousFlow variables", "href": "../../../../source/materials/PorousFlowTemperature.html"}>>>
temperature<<<{"description": "Fluid temperature variable. Note, the default is suitable if your simulation is using Kelvin units, but probably not for Celsius"}>>> = temperature
[]
[porosity]
type = PorousFlowPorosityConst<<<{"description": "This Material calculates the porosity assuming it is constant", "href": "../../../../source/materials/PorousFlowPorosityConst.html"}>>>
porosity<<<{"description": "The porosity (assumed indepenent of porepressure, temperature, strain, etc, for this material). This should be a real number, or a constant monomial variable (not a linear lagrange or other kind of variable)."}>>> = 0.2
[]
[phe]
type = ComputePlasticHeatEnergy<<<{"description": "Plastic heat energy density = stress * plastic_strain_rate", "href": "../../../../source/materials/ComputePlasticHeatEnergy.html"}>>>
[]
[elasticity_tensor]
type = ComputeElasticityTensor<<<{"description": "Compute an elasticity tensor.", "href": "../../../../source/materials/ComputeElasticityTensor.html"}>>>
fill_method<<<{"description": "The fill method"}>>> = symmetric_isotropic
C_ijkl<<<{"description": "Stiffness tensor for material"}>>> = '0.5 0.25'
[]
[strain]
type = ComputeIncrementalStrain<<<{"description": "Compute a strain increment and rotation increment for small strains.", "href": "../../../../source/materials/ComputeIncrementalStrain.html"}>>>
displacements<<<{"description": "The displacements appropriate for the simulation geometry and coordinate system"}>>> = 'disp_x disp_y disp_z'
[]
[admissible]
type = ComputeMultipleInelasticStress<<<{"description": "Compute state (stress and internal parameters such as plastic strains and internal parameters) using an iterative process. Combinations of creep models and plastic models may be used.", "href": "../../../../source/materials/ComputeMultipleInelasticStress.html"}>>>
inelastic_models<<<{"description": "The material objects to use to calculate stress and inelastic strains. Note: specify creep models first and plasticity models second."}>>> = mc
perform_finite_strain_rotations<<<{"description": "Tensors are correctly rotated in finite-strain simulations. For optimal performance you can set this to 'false' if you are only ever using small strains"}>>> = false
[]
[mc]
type = CappedWeakPlaneStressUpdate<<<{"description": "Capped weak-plane plasticity stress calculator", "href": "../../../../source/materials/CappedWeakPlaneStressUpdate.html"}>>>
cohesion<<<{"description": "A SolidMechanicsHardening UserObject that defines hardening of the cohesion. Physically the cohesion should not be negative."}>>> = coh
tan_friction_angle<<<{"description": "A SolidMechanicsHardening UserObject that defines hardening of tan(friction angle). Physically the friction angle should be between 0 and 90deg."}>>> = tanphi
tan_dilation_angle<<<{"description": "A SolidMechanicsHardening UserObject that defines hardening of the tan(dilation angle). Usually the dilation angle is not greater than the friction angle, and it is between 0 and 90deg."}>>> = tanphi
tensile_strength<<<{"description": "A SolidMechanicsHardening UserObject that defines hardening of the weak-plane tensile strength. In physical situations this is positive (and always must be greater than negative compressive-strength."}>>> = t_strength
compressive_strength<<<{"description": "A SolidMechanicsHardening UserObject that defines hardening of the weak-plane compressive strength. In physical situations this is positive."}>>> = c_strength
tip_smoother<<<{"description": "The cone vertex at shear-stress = 0 will be smoothed by the given amount. Typical value is 0.1*cohesion"}>>> = 0
smoothing_tol<<<{"description": "Intersections of the yield surfaces will be smoothed by this amount (this is measured in units of stress). Often this is related to other physical parameters (eg, 0.1*cohesion) but it is important to set this small enough so that the individual yield surfaces do not mix together in the smoothing process to produce a result where no stress is admissible (for example, mixing together tensile and compressive failure envelopes)."}>>> = 1
yield_function_tol<<<{"description": "The return-map process will be deemed to have converged if all yield functions are within yield_function_tol of zero. If this is set very low then precision-loss might be encountered: if the code detects precision loss then it also deems the return-map process has converged."}>>> = 1E-10
perfect_guess<<<{"description": "Provide a guess to the Newton-Raphson procedure that is the result from perfect plasticity. With severe hardening/softening this may be suboptimal."}>>> = true
[]
[]
[Postprocessors<<<{"href": "../../../../syntax/Postprocessors/index.html"}>>>]
[temp]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../../source/postprocessors/PointValue.html"}>>>
point<<<{"description": "The physical point where the solution will be evaluated."}>>> = '0 0 0'
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = temperature
[]
[]
[Preconditioning<<<{"href": "../../../../syntax/Preconditioning/index.html"}>>>]
[andy]
type = SMP<<<{"description": "Single matrix preconditioner (SMP) builds a preconditioner using user defined off-diagonal parts of the Jacobian.", "href": "../../../../source/preconditioners/SingleMatrixPreconditioner.html"}>>>
full<<<{"description": "Set to true if you want the full set of couplings between variables simply for convenience so you don't have to set every off_diag_row and off_diag_column combination."}>>> = true
petsc_options_iname<<<{"description": "Names of PETSc name/value pairs"}>>> = '-ksp_type -pc_type -snes_atol -snes_rtol -snes_max_it'
petsc_options_value<<<{"description": "Values of PETSc name/value pairs (must correspond with \"petsc_options_iname\""}>>> = 'bcgs bjacobi 1E-15 1E-10 10000'
[]
[]
[Executioner<<<{"href": "../../../../syntax/Executioner/index.html"}>>>]
type = Transient
solve_type = Newton
dt = 1
end_time = 10
[]
[Outputs<<<{"href": "../../../../syntax/Outputs/index.html"}>>>]
file_base<<<{"description": "Common file base name to be utilized with all output objects"}>>> = compressive01
csv<<<{"description": "Output the scalar variable and postprocessors to a *.csv file using the default CSV output."}>>> = true
[]
(moose/modules/porous_flow/test/tests/plastic_heating/compressive01.i)This implies only non-zero component of total strain is The constitutive law implies This stress is admissible for , while for the system yields in compression and the plastic strain is, This means that the material's temperature should increase as and there should be no temperature increase for .
MOOSE produces this result exactly
Shear failure
The top of the finite element is sheared with displacement: while the displacement on the element's bottom, and in the and directions is chosen to be zero.
# Tensile heating, using capped weak-plane plasticity
# x_disp(z=1) = t
# totalstrain_xz = t
# with C_ijkl = 0.5 0.25
# stress_zx = stress_xz = 0.25*t, so q=0.25*t, but
# with cohesion=1 and tan(phi)=1: max(q)=1. With tan(psi)=0,
# the plastic return is always to (p, q) = (0, 1),
# so plasticstrain_zx = max(t - 4, 0)
# heat_energy_rate = coeff * (t - 4) for t>4
# Heat capacity of rock = specific_heat_cap * density = 4
# So temperature of rock should be:
# (1 - porosity) * 4 * T = (1 - porosity) * coeff * (t - 4)
[Mesh<<<{"href": "../../../../syntax/Mesh/index.html"}>>>]
type = GeneratedMesh
dim = 3
xmin = -10
xmax = 10
zmin = 0
zmax = 1
[]
[GlobalParams<<<{"href": "../../../../syntax/GlobalParams/index.html"}>>>]
displacements = 'disp_x disp_y disp_z'
PorousFlowDictator = dictator
[]
[Variables<<<{"href": "../../../../syntax/Variables/index.html"}>>>]
[temperature]
[]
[]
[Kernels<<<{"href": "../../../../syntax/Kernels/index.html"}>>>]
[energy_dot]
type = PorousFlowEnergyTimeDerivative<<<{"description": "Derivative of heat-energy-density wrt time", "href": "../../../../source/kernels/PorousFlowEnergyTimeDerivative.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = temperature
base_name<<<{"description": "For mechanically-coupled systems, this Kernel will depend on the volumetric strain. base_name should almost always be the same base_name as given to the TensorMechanics object that computes strain. Supplying a base_name to this Kernel but not defining an associated TensorMechanics strain calculator means that this Kernel will not depend on volumetric strain. That could be useful when models contain solid mechanics that is not coupled to porous flow, for example"}>>> = non_existent
[]
[phe]
type = PorousFlowPlasticHeatEnergy<<<{"description": "Plastic heat energy density source = (1 - porosity) * coeff * stress * plastic_strain_rate", "href": "../../../../source/kernels/PorousFlowPlasticHeatEnergy.html"}>>>
variable<<<{"description": "The name of the variable that this residual object operates on"}>>> = temperature
coeff<<<{"description": "Heat energy density = coeff * stress * plastic_strain_rate"}>>> = 8
[]
[]
[AuxVariables<<<{"href": "../../../../syntax/AuxVariables/index.html"}>>>]
[disp_x]
[]
[disp_y]
[]
[disp_z]
[]
[]
[AuxKernels<<<{"href": "../../../../syntax/AuxKernels/index.html"}>>>]
[disp_x]
type = FunctionAux<<<{"description": "Auxiliary Kernel that creates and updates a field variable by sampling a function through space and time.", "href": "../../../../source/auxkernels/FunctionAux.html"}>>>
variable<<<{"description": "The name of the variable that this object applies to"}>>> = disp_x
function<<<{"description": "The function to use as the value"}>>> = 'z*t'
[]
[]
[UserObjects<<<{"href": "../../../../syntax/UserObjects/index.html"}>>>]
[dictator]
type = PorousFlowDictator<<<{"description": "Holds information on the PorousFlow variable names", "href": "../../../../source/userobjects/PorousFlowDictator.html"}>>>
porous_flow_vars<<<{"description": "List of primary variables that are used in the PorousFlow simulation. Jacobian entries involving derivatives wrt these variables will be computed. In single-phase models you will just have one (eg 'pressure'), in two-phase models you will have two (eg 'p_water p_gas', or 'p_water s_water'), etc."}>>> = temperature
number_fluid_phases<<<{"description": "The number of fluid phases in the simulation"}>>> = 0
number_fluid_components<<<{"description": "The number of fluid components in the simulation"}>>> = 0
[]
[coh]
type = TensorMechanicsHardeningConstant<<<{"description": "No hardening - the parameter is independent of the internal parameter(s)", "href": "../../../../source/userobjects/SolidMechanicsHardeningConstant.html"}>>>
value<<<{"description": "The value of the parameter for all internal parameter. This is perfect plasticity - there is no hardening."}>>> = 1
[]
[tanphi]
type = TensorMechanicsHardeningConstant<<<{"description": "No hardening - the parameter is independent of the internal parameter(s)", "href": "../../../../source/userobjects/SolidMechanicsHardeningConstant.html"}>>>
value<<<{"description": "The value of the parameter for all internal parameter. This is perfect plasticity - there is no hardening."}>>> = 1.0
[]
[tanpsi]
type = TensorMechanicsHardeningConstant<<<{"description": "No hardening - the parameter is independent of the internal parameter(s)", "href": "../../../../source/userobjects/SolidMechanicsHardeningConstant.html"}>>>
value<<<{"description": "The value of the parameter for all internal parameter. This is perfect plasticity - there is no hardening."}>>> = 0.0
[]
[t_strength]
type = TensorMechanicsHardeningConstant<<<{"description": "No hardening - the parameter is independent of the internal parameter(s)", "href": "../../../../source/userobjects/SolidMechanicsHardeningConstant.html"}>>>
value<<<{"description": "The value of the parameter for all internal parameter. This is perfect plasticity - there is no hardening."}>>> = 10
[]
[c_strength]
type = TensorMechanicsHardeningConstant<<<{"description": "No hardening - the parameter is independent of the internal parameter(s)", "href": "../../../../source/userobjects/SolidMechanicsHardeningConstant.html"}>>>
value<<<{"description": "The value of the parameter for all internal parameter. This is perfect plasticity - there is no hardening."}>>> = 10
[]
[]
[Materials<<<{"href": "../../../../syntax/Materials/index.html"}>>>]
[rock_internal_energy]
type = PorousFlowMatrixInternalEnergy<<<{"description": "This Material calculates the internal energy of solid rock grains, which is specific_heat_capacity * density * temperature. Kernels multiply this by (1 - porosity) to find the energy density of the porous rock in a rock-fluid system", "href": "../../../../source/materials/PorousFlowMatrixInternalEnergy.html"}>>>
specific_heat_capacity<<<{"description": "Specific heat capacity of the rock grains (J/kg/K)."}>>> = 2
density<<<{"description": "Density of the rock grains"}>>> = 2
[]
[temp]
type = PorousFlowTemperature<<<{"description": "Material to provide temperature at the quadpoints or nodes and derivatives of it with respect to the PorousFlow variables", "href": "../../../../source/materials/PorousFlowTemperature.html"}>>>
temperature<<<{"description": "Fluid temperature variable. Note, the default is suitable if your simulation is using Kelvin units, but probably not for Celsius"}>>> = temperature
[]
[porosity]
type = PorousFlowPorosityConst<<<{"description": "This Material calculates the porosity assuming it is constant", "href": "../../../../source/materials/PorousFlowPorosityConst.html"}>>>
porosity<<<{"description": "The porosity (assumed indepenent of porepressure, temperature, strain, etc, for this material). This should be a real number, or a constant monomial variable (not a linear lagrange or other kind of variable)."}>>> = 0.7
[]
[phe]
type = ComputePlasticHeatEnergy<<<{"description": "Plastic heat energy density = stress * plastic_strain_rate", "href": "../../../../source/materials/ComputePlasticHeatEnergy.html"}>>>
[]
[elasticity_tensor]
type = ComputeElasticityTensor<<<{"description": "Compute an elasticity tensor.", "href": "../../../../source/materials/ComputeElasticityTensor.html"}>>>
fill_method<<<{"description": "The fill method"}>>> = symmetric_isotropic
C_ijkl<<<{"description": "Stiffness tensor for material"}>>> = '0.5 0.25'
[]
[strain]
type = ComputeIncrementalStrain<<<{"description": "Compute a strain increment and rotation increment for small strains.", "href": "../../../../source/materials/ComputeIncrementalStrain.html"}>>>
displacements<<<{"description": "The displacements appropriate for the simulation geometry and coordinate system"}>>> = 'disp_x disp_y disp_z'
[]
[admissible]
type = ComputeMultipleInelasticStress<<<{"description": "Compute state (stress and internal parameters such as plastic strains and internal parameters) using an iterative process. Combinations of creep models and plastic models may be used.", "href": "../../../../source/materials/ComputeMultipleInelasticStress.html"}>>>
inelastic_models<<<{"description": "The material objects to use to calculate stress and inelastic strains. Note: specify creep models first and plasticity models second."}>>> = mc
perform_finite_strain_rotations<<<{"description": "Tensors are correctly rotated in finite-strain simulations. For optimal performance you can set this to 'false' if you are only ever using small strains"}>>> = false
[]
[mc]
type = CappedWeakPlaneStressUpdate<<<{"description": "Capped weak-plane plasticity stress calculator", "href": "../../../../source/materials/CappedWeakPlaneStressUpdate.html"}>>>
cohesion<<<{"description": "A SolidMechanicsHardening UserObject that defines hardening of the cohesion. Physically the cohesion should not be negative."}>>> = coh
tan_friction_angle<<<{"description": "A SolidMechanicsHardening UserObject that defines hardening of tan(friction angle). Physically the friction angle should be between 0 and 90deg."}>>> = tanphi
tan_dilation_angle<<<{"description": "A SolidMechanicsHardening UserObject that defines hardening of the tan(dilation angle). Usually the dilation angle is not greater than the friction angle, and it is between 0 and 90deg."}>>> = tanpsi
tensile_strength<<<{"description": "A SolidMechanicsHardening UserObject that defines hardening of the weak-plane tensile strength. In physical situations this is positive (and always must be greater than negative compressive-strength."}>>> = t_strength
compressive_strength<<<{"description": "A SolidMechanicsHardening UserObject that defines hardening of the weak-plane compressive strength. In physical situations this is positive."}>>> = c_strength
tip_smoother<<<{"description": "The cone vertex at shear-stress = 0 will be smoothed by the given amount. Typical value is 0.1*cohesion"}>>> = 0
smoothing_tol<<<{"description": "Intersections of the yield surfaces will be smoothed by this amount (this is measured in units of stress). Often this is related to other physical parameters (eg, 0.1*cohesion) but it is important to set this small enough so that the individual yield surfaces do not mix together in the smoothing process to produce a result where no stress is admissible (for example, mixing together tensile and compressive failure envelopes)."}>>> = 1
yield_function_tol<<<{"description": "The return-map process will be deemed to have converged if all yield functions are within yield_function_tol of zero. If this is set very low then precision-loss might be encountered: if the code detects precision loss then it also deems the return-map process has converged."}>>> = 1E-10
perfect_guess<<<{"description": "Provide a guess to the Newton-Raphson procedure that is the result from perfect plasticity. With severe hardening/softening this may be suboptimal."}>>> = true
[]
[]
[Postprocessors<<<{"href": "../../../../syntax/Postprocessors/index.html"}>>>]
[temp]
type = PointValue<<<{"description": "Compute the value of a variable at a specified location", "href": "../../../../source/postprocessors/PointValue.html"}>>>
point<<<{"description": "The physical point where the solution will be evaluated."}>>> = '0 0 0'
variable<<<{"description": "The name of the variable that this postprocessor operates on."}>>> = temperature
[]
[]
[Preconditioning<<<{"href": "../../../../syntax/Preconditioning/index.html"}>>>]
[andy]
type = SMP<<<{"description": "Single matrix preconditioner (SMP) builds a preconditioner using user defined off-diagonal parts of the Jacobian.", "href": "../../../../source/preconditioners/SingleMatrixPreconditioner.html"}>>>
full<<<{"description": "Set to true if you want the full set of couplings between variables simply for convenience so you don't have to set every off_diag_row and off_diag_column combination."}>>> = true
petsc_options_iname<<<{"description": "Names of PETSc name/value pairs"}>>> = '-ksp_type -pc_type -snes_atol -snes_rtol -snes_max_it'
petsc_options_value<<<{"description": "Values of PETSc name/value pairs (must correspond with \"petsc_options_iname\""}>>> = 'bcgs bjacobi 1E-15 1E-10 10000'
[]
[]
[Executioner<<<{"href": "../../../../syntax/Executioner/index.html"}>>>]
type = Transient
solve_type = Newton
dt = 1
end_time = 10
[]
[Outputs<<<{"href": "../../../../syntax/Outputs/index.html"}>>>]
file_base<<<{"description": "Common file base name to be utilized with all output objects"}>>> = shear01
csv<<<{"description": "Output the scalar variable and postprocessors to a *.csv file using the default CSV output."}>>> = true
[]
(moose/modules/porous_flow/test/tests/plastic_heating/shear01.i)This implies only non-zero component of total strain is The constitutive law implies This stress is admissible for , while for the system yields in shear: and the plastic strain is, This means that the material's temperature should increase as while the right-hand side is zero for .
PorousFlow produces this result exactly.