ElectrostrictiveCouplingPolarDerivative

Calculates a residual contribution due to the variation w.r.t polarization of the electrostrictive coupling energy. Note: for cubic parent phase only.

Overview

Computes the residual and jacobian contributions corresponding microforces generated by variations of polarization P\mathbf{P} of the electrostrictive free energy density felecstrf_\mathrm{elecstr}. The governing time-dependent Landau-Ginzburg-Devonshire (TDLGD) equation of relaxation of the ferroelectric order is given by,

Pt=ΓPδfδP, \begin{aligned} \frac{\partial \mathbf{P}}{\partial t} = - \Gamma_P \frac{\delta f}{\delta \mathbf{P}}, \end{aligned}

and we look for variational derivatives of

felecstr=q11(Px2εxx+Py2εyy+Pz2εzz)+q12[(Px2+Py2)εzz+(Py2+Pz2)εxx+(Px2+Pz2)εyy]+q44(PxPyεyx+PxPzεxz+PyPzεyz), \begin{aligned} f_\mathrm{elecstr} &= q_{11} \left(P_x^2 \varepsilon_{xx} + P_y^2 \varepsilon_{yy} + P_z^2 \varepsilon_{zz}\right) \\ &+ q_{12} \left[ \left(P_x^2 + P_y^2\right) \varepsilon_{zz} + \left(P_y^2 + P_z^2\right) \varepsilon_{xx} + \left(P_x^2 + P_z^2\right) \varepsilon_{yy}\right] \\ &+ q_{44} \left(P_x P_y \varepsilon_{yx} + P_x P_z \varepsilon_{xz} + P_y P_z \varepsilon_{yz}\right), \end{aligned}

suitable for cubic parent phase ferroelectric materials (i.e. PbTiO3\mathrm{PbTiO}_3 and BaTiO3\mathrm{BaTiO}_3). The coefficients q11,q12q_{11}, q_{12}, and q44q_{44} are the electrostrictive tensor components (in Voight notation). We can write this index notation in general for any symmetry qijklq_{ijkl} tensor,

felecstr=qijklPiPjεkl, \begin{aligned} f_\mathrm{elecstr} &= q_{ijkl} P_i P_j \varepsilon_{kl}, \end{aligned}

Note that for the variational derivative,

δfelecstrδP=felecstrPrf(Pr) \begin{aligned} \frac{\delta f_\mathrm{elecstr}}{\delta \mathbf{P}} = \frac{\partial f_\mathrm{elecstr}}{\partial \mathbf{P}} - \frac{\partial}{\partial \mathbf{r}} \cdot \frac{\partial f}{\left(\frac{\partial \mathbf{P}}{\partial \mathbf{r}}\right)} \end{aligned}

only the first term is important because there are no explicit gradients in P\mathbf{P}. Therefore, we have after multiplying the TDLGD equation by a test function ψh\psi_h and integrating on both sides, in index notation we have,

(ψh,δfelecstrδPβ)=(ψh,(qijklPiPjεkl)Pβ)=0=(ψh,2qijklδiβPjεkl)=0=(ψh,2qβjklPjεkl)=0 \begin{aligned} \left(\psi_h,\frac{\delta f_\mathrm{elecstr}}{\delta P_\beta}\right) = \left(\psi_h,\frac{\partial \left(q_{ijkl} P_i P_j \varepsilon_{kl}\right)}{\partial P_\beta}\right) &= 0 \\ = \left(\psi_h, 2 q_{ijkl} \delta_{i\beta} P_j \varepsilon_{kl}\right) &= 0\\ = \left(\psi_h, 2 q_{\beta jkl} P_j \varepsilon_{kl}\right) &= 0 \end{aligned}

Note that we ignore the time derivative as it is handled by another Kernel. This is our residual contribution for PβP_\beta.

RPβ=(ψh,2qβjklPjεkl) \begin{aligned} \mathcal{R}_{P_\beta} = \left(\psi_h, 2 q_{\beta jkl} P_j \varepsilon_{kl}\right) \end{aligned}

Next we need the on-diagonal jacobian contribution,

JPβ,Pβ=RPβPβ=(ψh,2ϕqββklεkl) \begin{aligned} \mathcal{J}_{P_\beta, P_\beta} &= \frac{\partial \mathcal{R}_{P_\beta}}{\partial P_\beta} \\ &= \left(\psi_h, 2 \phi \, q_{\beta \beta kl} \varepsilon_{kl}\right) \end{aligned}

where ϕ\phi is a shape function of the finite element method. To compute the off-diagonal jacobian contributions, we have

JPβ,Pγ=RPβPγ=(ψh,2ϕqβγklεkl). \begin{aligned} \mathcal{J}_{P_\beta, P_\gamma} &= \frac{\partial \mathcal{R}_{P_\beta}}{\partial P_\gamma} \\ &= \left(\psi_h, 2 \phi \, q_{\beta \gamma kl} \varepsilon_{kl}\right). \end{aligned}

Rewriting the strain in terms of the symmetric and antisymmetric derivatives of the elastic displacement, we have

JPβ,uγ=RPβuγ=uγ(ψh,qβjklPj[ukxl+ulxk])=(ψh,Pj[qβjklδkγϕxl+qβjklδlγϕxk])=(ψh,Pj[qβjγlϕxl+qβjkγϕxk]) \begin{aligned} \mathcal{J}_{P_\beta, u_\gamma} = \frac{\partial \mathcal{R}_{P_\beta}}{\partial u_\gamma} &= \frac{\partial}{\partial u_\gamma }\left(\psi_h, q_{\beta jkl} P_j \left[\frac{\partial u_k}{\partial x_l} + \frac{\partial u_l}{\partial x_k}\right]\right)\\ &= \left(\psi_h, P_j \left[ q_{\beta jkl} \delta_{k\gamma}\frac{\partial \phi}{\partial x_l} + q_{\beta jkl} \delta_{l\gamma} \frac{\partial \phi}{\partial x_k}\right]\right) \\ &= \left(\psi_h, P_j \left[ q_{\beta j\gamma l} \frac{\partial \phi}{\partial x_l} + q_{\beta jk\gamma } \frac{\partial \phi}{\partial x_k}\right]\right) \end{aligned}

with again using the fact that uixl/uj=δijϕxl\partial \frac{\partial u_i}{\partial x_l} / \partial u_j = \delta_{ij} \frac{\partial \phi}{\partial x_l} with δij\delta_{ij} the Kronecker product. This Kernel is hard-coded currently).The residual vector components, in Voight notation for a cubic symmetry parent phase ferroelectric, are,

RPx=RPy=RPz= \begin{aligned} \mathcal{R}_{P_x} &=\\ \mathcal{R}_{P_y} &=\\ \mathcal{R}_{P_z} &= \end{aligned}

and

JPx,Px=JPx,Py=JPx,Pz=JPy,Px=JPy,Py=JPy,Pz=JPz,Px=JPz,Py=JPz,Pz= \begin{aligned} \mathcal{J}_{P_x,P_x} &= \\ \mathcal{J}_{P_x,P_y} &=\\ \mathcal{J}_{P_x,P_z} &=\\ \mathcal{J}_{P_y,P_x} &=\\ \mathcal{J}_{P_y,P_y} &=\\ \mathcal{J}_{P_y,P_z} &=\\ \mathcal{J}_{P_z,P_x} &=\\ \mathcal{J}_{P_z,P_y} &=\\ \mathcal{J}_{P_z,P_z} &= \end{aligned}

Example Input File Syntax

Input Parameters

  • componentAn integer corresponding to the direction in order parameter space this kernel acts in (e.g. for unrotated functionals 0 for q_x, 1 for q_y, 2 for q_z).

    C++ Type:unsigned int

    Controllable:No

    Description:An integer corresponding to the direction in order parameter space this kernel acts in (e.g. for unrotated functionals 0 for q_x, 1 for q_y, 2 for q_z).

  • polar_xThe x component of the polarization

    C++ Type:std::vector<VariableName>

    Controllable:No

    Description:The x component of the polarization

  • polar_yThe y component of the polarization

    C++ Type:std::vector<VariableName>

    Controllable:No

    Description:The y component of the polarization

  • u_xThe x component of the local elastic displacement

    C++ Type:std::vector<VariableName>

    Controllable:No

    Description:The x component of the local elastic displacement

  • u_yThe y component of the local elastic displacement

    C++ Type:std::vector<VariableName>

    Controllable:No

    Description:The y component of the local elastic displacement

  • variableThe name of the variable that this residual object operates on

    C++ Type:NonlinearVariableName

    Controllable:No

    Description:The name of the variable that this residual object operates on

Required Parameters

  • blockThe list of blocks (ids or names) that this object will be applied

    C++ Type:std::vector<SubdomainName>

    Controllable:No

    Description:The list of blocks (ids or names) that this object will be applied

  • displacementsThe displacements

    C++ Type:std::vector<VariableName>

    Controllable:No

    Description:The displacements

  • polar_zThe z component of the polarization

    C++ Type:std::vector<VariableName>

    Controllable:No

    Description:The z component of the polarization

  • prop_getter_suffixAn optional suffix parameter that can be appended to any attempt to retrieve/get material properties. The suffix will be prepended with a '_' character.

    C++ Type:MaterialPropertyName

    Controllable:No

    Description:An optional suffix parameter that can be appended to any attempt to retrieve/get material properties. The suffix will be prepended with a '_' character.

  • u_zThe z component of the local elastic displacement

    C++ Type:std::vector<VariableName>

    Controllable:No

    Description:The z component of the local elastic displacement

Optional Parameters

  • absolute_value_vector_tagsThe tags for the vectors this residual object should fill with the absolute value of the residual contribution

    C++ Type:std::vector<TagName>

    Controllable:No

    Description:The tags for the vectors this residual object should fill with the absolute value of the residual contribution

  • extra_matrix_tagsThe extra tags for the matrices this Kernel should fill

    C++ Type:std::vector<TagName>

    Controllable:No

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

  • extra_vector_tagsThe extra tags for the vectors this Kernel should fill

    C++ Type:std::vector<TagName>

    Controllable:No

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

  • matrix_tagssystemThe tag for the matrices this Kernel should fill

    Default:system

    C++ Type:MultiMooseEnum

    Options:nontime, system

    Controllable:No

    Description:The tag for the matrices this Kernel should fill

  • vector_tagsnontimeThe tag for the vectors this Kernel should fill

    Default:nontime

    C++ Type:MultiMooseEnum

    Options:nontime, time

    Controllable:No

    Description:The tag for the vectors this Kernel should fill

Tagging Parameters

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

    C++ Type:std::vector<std::string>

    Controllable:No

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

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

    C++ Type:std::vector<AuxVariableName>

    Controllable:No

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

  • enableTrueSet the enabled status of the MooseObject.

    Default:True

    C++ Type:bool

    Controllable:Yes

    Description:Set the enabled status of the MooseObject.

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

    Default:True

    C++ Type:bool

    Controllable:No

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

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

    C++ Type:std::vector<AuxVariableName>

    Controllable:No

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

  • seed0The seed for the master random number generator

    Default:0

    C++ Type:unsigned int

    Controllable:No

    Description:The seed for the master random number generator

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

    Default:False

    C++ Type:bool

    Controllable:No

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

Advanced Parameters

Input Files