Once you have developed a phase field model using implicit time integration, you need to solve your system of nonlinear equations using MOOSE. MOOSE uses the PETSc package to solve the equations, therefore PETSc options that we have found to work well for phase field modeling are provided here.
Three solve methods are available in MOOSE, which are set in the Executioner block using the solve_type parameter, where the three possible options are:
When using NEWTON or PJFNK, PETSc is used to manipulate the Jacobian/preconditioner matrix. The method used for this manipulation is defined using PETSc options in the Executioner block. Determining the optimal approach can be difficult, but we have identified certain options that work well for phase field problems. They are summarized below:
This uses LU decomposition to directly apply the inverse of the Jacobian matrix. It is typically the most accurate approach, but is expensive and only works on one processor. It is often a good debugging tool. Typical options in the block are
petsc_options_iname = '-pc_type' petsc_options_value = 'lu'
The Additive Schwartz Method (ASM), is a domain decomposition method. It works well for most models, and is the only method that works well with the split Cahn-Hilliard equations. Increasing the -pc_asm_overlap improves performance but increases the computational expense. Typical options are
petsc_options_iname = '-pc_type -ksp_grmres_restart -sub_ksp_type -sub_pc_type -pc_asm_overlap' petsc_options_value = 'asm 31 preonly lu 2'
The incomplete factorization method (ILU) allows specifying a fill factor using
-pc_factor_levels increasing this can improve the preconditioner.
BoomerAMG is the Hypre implementation of the Algebraic MultiGrid Method. It works well for solving the Allen-Cahn equation and the direct solution of the Cahn-Hilliard method. It has horrible performance with solving the split Cahn-Hilliard equations. Common options are
petsc_options_iname = '-pc_type -pc_hypre_type -ksp_gmres_restart -pc_hypre_boomeramg_strong_threshold' petsc_options_value = 'hypre boomeramg 31 0.7'