SingleGrainRigidBodyMotion and MultiGrainRigidBodyMotion kernels add advection terms to AC and CH equations, respectively. This results in movement of whole grain as rigid body. The advection velocities are being calculated in GrainAdvectionVelocity Material. In case of grains in porous media, advection term is generated due to externally applied loads or due to interaction between grains.

Grain Center UserObject

ComputeGrainCenterUserObject calculates volume and co-ordinate of the center of grains identified with order parameters. For a particular $$$(i^{th})$$$ grain with order parameter $$$\eta_i$$$, grain volume is, $$$$\begin{eqnarray} V_i = \int_V \eta_i \, dV, \end{eqnarray}$$$$ And the center of the grains are calculated as, $$$$\begin{eqnarray} r_{c_i} = \int_V r \eta_i \, dV \end{eqnarray}$$$$ where, $$$r_{c_i}$$$ is center of the $$$i^{th}$$$ grain and r is a position vector. This UserObject outputs a vector of real, GrainVolumes, which stores volumes of the grains and GrainCenters, a vector of points storing co-ordinates of the grains' centers. GrainCentersPostProcessor is corresponding VectorPostprocessor to output grain centers and volumes from ComputeGrainCenterUserobject.

Grain Force and Torque

ComputeGrainForceAndTorque is an UserObject used to calculate the total force on a grain due to force density acting on grains. For force density being $$$\delta F$$$, total forces and torques are calculated as follows, $$$$\begin{eqnarray} F_i = \int_V \delta F \, dV, \end{eqnarray}$$$$ $$$$\begin{eqnarray} T_i = \int_V (r- r_{c_i}) \times \delta F \, dV, \end{eqnarray}$$$$

Both forces ($$$F_i$$$) and torques ($$$T_i$$$) here are vector of RealGradient of size same as no. of order parameters. Direct constant forces and torques can also be applied to grains using ConstatntGrainForceAndTorque Userobject. GrainForcesPostProcessor is corresponding VectorPostprocessor to output forces and torques acting on grain from UserObject.

Due to existence of the integral terms, the jacobian calculation corresponding to grain force and grain torques are needed to be calculated in the UserObject itself. Shape functions are needed to be considered within the integral the and each term contributes to all the global dofs (not only the local dofs). In order to execute this jacobian calculation, additional capability of calculating nonlocal jacobian has been implemented in framework.

Force Density

ForceDensityMaterial is designed for considering reaction forces between particles when one particle interact with other. The force density is calculated as, $$$$\begin{eqnarray} \delta F = k \sum_{i \neq j} [(c-c_0) <\eta_i \eta_j> (\nabla \eta_i - \nabla \eta_j)] \end{eqnarray}$$$$ here, $$$k$$$ is a stiffness constant, $$$c_0$$$ is the equilibrium concentration. $$$<\eta_i \eta_j>$$$ is defined as, \begin{eqnarray} <\eta_i \eta_j> &=& 1,\ if\ \eta_i \eta_j > c_{gb}\ and\
0,\ otherwise \end{eqnarray} $$$c_{gb}$$$ being the threshold concentration for identifying the grain boundaries. This term ensures that the force density is generated only due to interaction between particles.

Different force density functions can be developed depending on the problem and corresponding loads. Each force density function will require corresponding UserObject for calculating the forces and jacobians.

Grain Advection Velocity

GrainAdvectionVelocity is a material which calculates advection velocities grains are subjected to. Advection velocity has two components, translational and rotational components.

$$$$\begin{eqnarray} v_{adv} = v_t + v_r \end{eqnarray}$$$$ The components of advection velocities are calculated for each grains, $$$$\begin{eqnarray} v_{t_i} = \frac{m_t}{V_i} F_i , \end{eqnarray}$$$$ $$$$\begin{eqnarray} v_{r_i} = \frac{m_r}{V_i} T_i \times (r- r_{c_i}) \end{eqnarray}$$$$

where, $$$m_t$$$ and $$$m_r$$$ are constants corresponding to translational and rotational masses of the grains, respectively. $$$F_i$$$ and $$$T_i$$$ are the forces and torques acting on grains and $$$V_i$$$ being the grain volume.

Grain Rigid Body Motion

There are two kernels, SingleGrainRigidBodyMotion and MultiGrainRigidBodyMotion, which introduces additional advection kernels corresponding to AC and CH equation. In case of MultiGrainRigidBodyMotion the advection velocity is summed over all the grains whereas SingleGrainRigidBodyMotion applies advection velocity of individual grains to corresponding order parameter evolution equation.

The Cahn-Hilliard equation is modified for incorporation of the advection as, $$$$\begin{eqnarray} \frac{\partial c}{\partial t} = \nabla \cdot \left ( M \nabla \frac{\delta F}{\delta c} - c \sum_i^n v_{adv_i} \right ) \end{eqnarray}$$$$ The modified strong form of Allen-Cahn equation is, $$$$\begin{equation} \frac{\partial \eta_i}{\partial t} = - L_i \frac{\delta F}{\delta \eta_i} - \nabla \cdot [ \eta_i v_{adv_i} ]\label{eq:AC} \end{equation}$$$$

Reference

  1. Yu U. Wang, "Computer modeling and simulation of solid-state sintering: A phase field approach", Acta Materialia 54 (953-961),2006.

  2. S. Biswas, D. Schwen, J. Singh, and V. Tomar, "A study of the evolution of microstructure and consolidation kinetics during sintering using a phase field modeling based approach," Extreme Mechanics Letters, Volume 7,pp.78–89, Jun. 2016.

Example Input File

Relevant input file blocks are shown here for reference,

[Kernels]
  [./motion]
    # advection kernel corrsponding to CH equation
    type = MultiGrainRigidBodyMotion
    variable = w
    c = c
    v = eta
  [../]
  [./vadv_eta]
    # advection kernel corrsponding to AC equation
    type = SingleGrainRigidBodyMotion
    variable = eta
    c = c
    v = eta
  [../]
[]
[Materials]
  [./advection_vel]
    # advection velocity is being calculated
    type = GrainAdvectionVelocity
    block = 0
    grain_force = grain_force
    etas = eta
    c = c
    grain_data = grain_center
  [../]
[]
[AuxVariables]
  [./vadv00]
    order = CONSTANT
    family = MONOMIAL
  [../]
[]
[AuxKernels]
  [./vadv00]
    # outputting components of advection velocity
    type = MaterialStdVectorRealGradientAux
    variable = vadv00
    property = advection_velocity
  [../]
[]
[UserObjects]
  [./grain_center]
    # user object for extracting grain centers and volumes
    type = ComputeGrainCenterUserObject
    etas = eta
    execute_on = 'initial linear'
  [../]
  [./grain_force]
    # constant force and torque is applied on grains
    type = ConstantGrainForceAndTorque
    execute_on = 'initial linear'
    force = '0.2 0.0 0.0 ' # size should be 3 * no. of grains
    torque = '0.0 0.0 5.0 ' # size should be 3 * no. of grains
  [../]
[]
[VectorPostprocessors]
  [./centers]
    # VectorPostprocessor for outputing grain centers and volumes
    type = GrainCentersPostprocessor
    grain_data = grain_center
  [../]
  [./forces]
    # VectorPostprocessor for outputing grain forces and torques
    type = GrainForcesPostprocessor
    grain_force = grain_force
  [../]
[]