Elastic Driving Force for Grain Growth
Grain boundaries (GBs) migrate to reduce the free energy of the system. One source of energy that can be reduced is the grain boundary energy, and the standard grain growth model accounts for this driving force (commonly called the curvature driving force). In addition, GBs can migrate to reduce the elastic energy stored in the system. To account for this driving force in the grain growth model, we couple to a mechanics solution.
Model Summary
In our model, grains are represented by order parameters, where . Each grain has a unique ID and is represented by a specific order parameter , though the order parameter used for each grain can change throughout the simulation. The assignment of the order parameters to each grain is controlled by the GrainTracker user object.
The crystal orientation of each grain is described by a set of three Euler angles . The Euler angles define a rotation tensor used to rotate the elasticity tensor in the crystal frame of reference to the current frame. Thus, the elasticity tensor for each grain is fully defined by
where is the fourth-order tensor product. In the phase field model, the grain boundaries are represented by a diffuse interface in which multiple order parameters have non-zero values. Thus, the elasticity tensor at any point in space is a weighted average of the elasticity tensors from all grains with non-zero order parameters, i.e.
where the interpolation function is equal to 0 when and 1 when , i.e.
The local stress is calculated from the local elasticity tensor according to
and the elastic energy density is calculated according to
The elastic energy is added to the free energy of the system, as shown on the Basic Phase Field Equations page. The Allen-Cahn equation defining the evolution of the order parameters becomes
where
The partial derivative of the elasticity tensor with respect to the order parameters is defined by
Model Implementation
The additional contribution of elastic energy on the Allen-Cahn equation describing grain growth is implemented in the phase field module with the kernel ACGrGrElasticDrivingForce. It only adds the elastic energy contribution, so it must be used with the ACGrGrPoly kernel. The addition to the residual in weak form is
and is implemented in the code according to
Real
ACGrGrElasticDrivingForce::computeDFDOP(PFFunctionType type)
{
// Access the heterogeneous strain calculated by the Solid Mechanics kernels
RankTwoTensor strain(_elastic_strain[_qp]);
// Compute the partial derivative of the stress wrt the order parameter
RankTwoTensor D_stress = _D_elastic_tensor[_qp] * strain;
switch (type)
{
case Residual:
return 0.5 * D_stress.doubleContraction(strain); // Compute the deformation energy driving force
case Jacobian:
return 0.0;
}
mooseError("Invalid type passed in");
}
The stress and strain are computed using kernels from the solid mechanics module, but a material in the phase field module was created to compute the polycrystal elasticity tensor, ComputePolycrystalElasticityTensor. It also computes the derivatives of the elasticity tensor with respect to all of the order parameters. This material must be used with the GrainTracker user object.
As with the basic grain growth model, creating separate blocks in the input file for every order parameter would be burdensome. Thus, we have implemented an action that adds the elastic driving force kernel for each order parameter. The action is PolycrystalElasticDrivingForceAction and it must be used with the PolycrystalKernelAction.
This capability is tested in
moose/modules/combined/tests/ACGrGrElasticDrivingForce
and is demonstrated on larger problems in
moose/modules/combined/examples/phase_field-mechanics/hex_grain_growth_2D_eldrforce.i
moose/modules/combined/examples/phase_field-mechanics/poly_grain_growth_2D_eldrforce.i