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.
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
.
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.
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.
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.
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}$$$$
Yu U. Wang, "Computer modeling and simulation of solid-state sintering: A phase field approach", Acta Materialia 54 (953-961),2006.
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.
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 [../] []