- G_ijNames of the gradient coefficients.
C++ Type:std::vector<std::string>
Controllable:No
Description:Names of the gradient coefficients.
- G_ij_valValues of the gradient coefficients.
C++ Type:std::vector<Real>
Unit:(no unit assumed)
Controllable:No
Description:Values of the gradient coefficients.
- alpha_ijklNames of the Landau expansion coefficients.
C++ Type:std::vector<std::string>
Controllable:No
Description:Names of the Landau expansion coefficients.
- alpha_ijkl_valValues of the Landau expansion coefficients.
C++ Type:std::vector<Real>
Unit:(no unit assumed)
Controllable:No
Description:Values of the Landau expansion coefficients.
CubicParentFEPhaseFieldAction
Set up a cubic-parent-phase ferroelectric problem: the polarization variables, the Landau bulk and gradient kernels, the optional electrostatic and electrostrictive couplings, the constant material properties and the free energy postprocessors. The mechanics themselves are left to the SolidMechanics QuasiStatic physics, which this action is designed to be used alongside; couple the two by listing 'eigenstrain_name' in its 'eigenstrain_names'.
Overview
Sets up a cubic-parent-phase ferroelectric problem: the three polarization components and the electrostatic potential, the Landau bulk and gradient kernels, the optional electrostatic and electrostrictive couplings, the constant material properties and the free energy postprocessors.
The mechanics are deliberately left to the SolidMechanics QuasiStatic physics, which owns the displacement variables, the strain calculator and the stress divergence kernels. The two actions are coupled through the eigenstrain: this action adds a ComputeCubicParentElectrostrictiveStrain named by eigenstrain_name, and that same name must appear in the SolidMechanics action's eigenstrain_names.
A prescribed mean strain (an epitaxial misfit, say) is supplied as a GenericConstantRankTwoTensor and reaches the strain calculator through [GlobalParams] global_strain. It contributes to total_strain, which is the quantity the cubic-parent polarization kernels read.
electrostatics and elastic are independent, so the action covers the purely polar-elastic problem as well as the full polar-elastic-electric one.
Elastic energy
Two routes are provided, and Ftotal uses the second when it is available:
Felastic, fromCubicParentElasticEnergy, which evaluates the cubic-parent form directly and subtracts only its own eigenstrain.Felastic_true, anElementIntegralVariablePostprocessorover thef_elaux variable thatElasticEnergyAuxfills with 1/2 sigma:elastic_strain. Because the strain calculator has already removed every eigenstrain listed in the SolidMechanics action'seigenstrain_names, this is the true elastic energy no matter how many contribute one, with no double counting and no cross term left over.
With a single eigenstrain the two agree to roundoff. They diverge as soon as anything else contributes an eigenstrain, and only Felastic_true stays correct; set add_elastic_energy_aux = false to drop it and fall back to Felastic.
At t = 0 the f_el aux reads a material state in which the eigenstrain has not yet been applied, so Felastic_true reports 1/2 eps:C:eps of the prescribed mean strain alone. Every subsequent step is correct. This is MOOSE's legacy material-output behaviour on INITIAL, not a property of this action.
Example Input File Syntax
[Ferret<<<{"href": "../../syntax/Ferret/index.html"}>>>]
[CubicParentFEPhaseField<<<{"href": "../../syntax/Ferret/CubicParentFEPhaseField/index.html"}>>>]
electrostatics<<<{"description": "Solve Poisson's equation for the depolarization field and couple it to the polarization."}>>> = true
elastic<<<{"description": "Couple the polarization to the strain through the cubic-parent electrostrictive energy."}>>> = true
alpha_ijkl<<<{"description": "Names of the Landau expansion coefficients."}>>> = 'alpha1 alpha11 alpha12 alpha111 alpha112 alpha123 alpha1111 alpha1112 alpha1122 alpha1123'
alpha_ijkl_val<<<{"description": "Values of the Landau expansion coefficients."}>>> = '${alpha1} -0.073 0.75 0.26 0.61 -3.7 0.0 0.0 0.0 0.0'
G_ij<<<{"description": "Names of the gradient coefficients."}>>> = 'G110 G11_G110 G12_G110 G44_G110 G44P_G110'
G_ij_val<<<{"description": "Values of the gradient coefficients."}>>> = '${G110} 0.6 0.0 0.3 0.3'
Q_ij<<<{"description": "Names of the electrostrictive Q tensor coefficients."}>>> = 'Q11 Q12 Q44'
Q_ij_val<<<{"description": "Values of the electrostrictive Q tensor coefficients."}>>> = '0.089 -0.026 0.03375'
C_ij<<<{"description": "Names of the elastic stiffness coefficients. Must be 'C11 C12 C44' (cubic parent)."}>>> = 'C11 C12 C44'
C_ij_val<<<{"description": "Values of the elastic stiffness coefficients."}>>> = '174.269 79.029 47.62'
permittivity_val<<<{"description": "Value of the permittivity."}>>> = '${fparse eps_r*eps0}'
[]
[](test/tests/action/PTO_2D_E_action.i)Alongside the SolidMechanics physics:
[Physics<<<{"href": "../../syntax/Physics/index.html"}>>>]
[SolidMechanics<<<{"href": "../../syntax/Physics/SolidMechanics/index.html"}>>>]
[QuasiStatic<<<{"href": "../../syntax/Physics/SolidMechanics/QuasiStatic/index.html"}>>>]
[all]
strain<<<{"description": "Strain formulation"}>>> = SMALL
add_variables<<<{"description": "Add the displacement variables"}>>> = true
eigenstrain_names<<<{"description": "List of eigenstrains to be applied in this strain calculation"}>>> = 'ferro'
generate_output<<<{"description": "Add scalar quantity output for stress and/or strain"}>>> = 'strain_xx strain_yy'
[]
[]
[]
[](test/tests/action/PTO_2D_E_action.i)Input Parameters
- C_ijC11 C12 C44 Names of the elastic stiffness coefficients. Must be 'C11 C12 C44' (cubic parent).
Default:C11 C12 C44
C++ Type:std::vector<std::string>
Controllable:No
Description:Names of the elastic stiffness coefficients. Must be 'C11 C12 C44' (cubic parent).
- C_ij_valValues of the elastic stiffness coefficients.
C++ Type:std::vector<Real>
Unit:(no unit assumed)
Controllable:No
Description:Values of the elastic stiffness coefficients.
- Q_ijQ11 Q12 Q44 Names of the electrostrictive Q tensor coefficients.
Default:Q11 Q12 Q44
C++ Type:std::vector<std::string>
Controllable:No
Description:Names of the electrostrictive Q tensor coefficients.
- Q_ij_valValues of the electrostrictive Q tensor coefficients.
C++ Type:std::vector<Real>
Unit:(no unit assumed)
Controllable:No
Description:Values of the electrostrictive Q tensor coefficients.
- active__all__ If specified only the blocks named will be visited and made active
Default:__all__
C++ Type:std::vector<std::string>
Controllable:No
Description:If specified only the blocks named will be visited and made active
- add_elastic_energy_auxTrueAdd the ElasticEnergyAux route to the elastic energy: an f_el aux variable holding 1/2 sigma:elastic_strain, integrated into the 'Felastic_true' postprocessor. Because the strain calculator has already removed EVERY eigenstrain in 'eigenstrain_names', this is the true elastic energy whatever else contributes one, whereas CubicParentElasticEnergy subtracts only its own. When on, 'Ftotal' uses it.
Default:True
C++ Type:bool
Controllable:No
Description:Add the ElasticEnergyAux route to the elastic energy: an f_el aux variable holding 1/2 sigma:elastic_strain, integrated into the 'Felastic_true' postprocessor. Because the strain calculator has already removed EVERY eigenstrain in 'eigenstrain_names', this is the true elastic energy whatever else contributes one, whereas CubicParentElasticEnergy subtracts only its own. When on, 'Ftotal' uses it.
- add_elastic_materialsTrueAlso add ComputeElasticityTensor and ComputeLinearElasticStress from 'C_ij_val'. Turn off to supply your own stress model.
Default:True
C++ Type:bool
Controllable:No
Description:Also add ComputeElasticityTensor and ComputeLinearElasticStress from 'C_ij_val'. Turn off to supply your own stress model.
- add_postprocessorsTrueAdd the free energy postprocessors.
Default:True
C++ Type:bool
Controllable:No
Description:Add the free energy postprocessors.
- add_variablesTrueAdd the polarization variables, and the potential when 'electrostatics' is true.
Default:True
C++ Type:bool
Controllable:No
Description:Add the polarization variables, and the potential when 'electrostatics' is true.
- base_nameMaterial property base name.
C++ Type:std::string
Controllable:No
Description:Material property base name.
- blockThe blocks this action operates on. Defaults to the whole mesh.
C++ Type:std::vector<SubdomainName>
Controllable:No
Description:The blocks this action operates on. Defaults to the whole mesh.
- displacementsThe displacement variables, as given to the SolidMechanics action. When supplied the P<-u Jacobian block is assembled.
C++ Type:std::vector<VariableName>
Unit:(no unit assumed)
Controllable:No
Description:The displacement variables, as given to the SolidMechanics action. When supplied the P<-u Jacobian block is assembled.
- eigenstrain_nameferroName of the spontaneous polar eigenstrain. List this same name in the SolidMechanics action's 'eigenstrain_names'.
Default:ferro
C++ Type:std::string
Controllable:No
Description:Name of the spontaneous polar eigenstrain. List this same name in the SolidMechanics action's 'eigenstrain_names'.
- elasticTrueCouple the polarization to the strain through the cubic-parent electrostrictive energy.
Default:True
C++ Type:bool
Controllable:No
Description:Couple the polarization to the strain through the cubic-parent electrostrictive energy.
- electrostaticsTrueSolve Poisson's equation for the depolarization field and couple it to the polarization.
Default:True
C++ Type:bool
Controllable:No
Description:Solve Poisson's equation for the depolarization field and couple it to the polarization.
- energy_scale1The energy scale of the postprocessors.
Default:1
C++ Type:Real
Unit:(no unit assumed)
Controllable:No
Description:The energy scale of the postprocessors.
- inactiveIf specified blocks matching these identifiers will be skipped.
C++ Type:std::vector<std::string>
Controllable:No
Description:If specified blocks matching these identifiers will be skipped.
- len_scale1The length scale of the unit.
Default:1
C++ Type:Real
Unit:(no unit assumed)
Controllable:No
Description:The length scale of the unit.
- permittivitypermittivity Name of the permittivity material property.
Default:permittivity
C++ Type:std::vector<std::string>
Controllable:No
Description:Name of the permittivity material property.
- permittivity_valValue of the permittivity.
C++ Type:std::vector<Real>
Unit:(no unit assumed)
Controllable:No
Description:Value of the permittivity.
- polar_time_dependenceTrueAdd the TimeDerivative kernels that make this a time-dependent (TDLGD) problem.
Default:True
C++ Type:bool
Controllable:No
Description:Add the TimeDerivative kernels that make this a time-dependent (TDLGD) problem.
- polar_varspolar_x polar_y polar_z The three polarization vector components.
Default:polar_x polar_y polar_z
C++ Type:std::vector<NonlinearVariableName>
Unit:(no unit assumed)
Controllable:No
Description:The three polarization vector components.
- potential_varpotential_E_intThe internal electrostatic potential variable.
Default:potential_E_int
C++ Type:NonlinearVariableName
Unit:(no unit assumed)
Controllable:No
Description:The internal electrostatic potential variable.
Optional 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.