Source code for phasefieldx.solvers.newton
"""
Newton solver
=============
This module provides a class for configuring a Newton solver with PETSc options, designed for solving
nonlinear problems in finite element analysis.
"""
import dolfinx
import mpi4py
import petsc4py
import dolfinx.nls.petsc
[docs]
class NewtonSolver:
"""
A class that encapsulates the configuration of a Newton solver with PETSc options.
"""
def __init__(self, problem):
"""
Initialize the NewtonSolver with a given problem.
Parameters
----------
problem : dolfinx.cpp.nls.Problem
The problem to be solved using the NewtonSolver.
"""
self.solver = dolfinx.nls.petsc.NewtonSolver(
mpi4py.MPI.COMM_WORLD, problem)
# Newton solver parameters
self.solver.max_it = 500 # Maximum number of Newton iterations per step
self.solver.rtol = 1e-8 # Relative tolerance for convergence
self.solver.atol = 1e-9 # Absolute tolerance for convergence
# Convergence criterion: "residual" or "incremental"
self.solver.convergence_criterion = "residual"
self.solver.report = True # Monitor convergence
self.solver.relaxation_parameter = 1.0 # Relaxation parameter
# Krylov solver parameters
self.ksp = self.solver.krylov_solver
self.opts = petsc4py.PETSc.Options()
self.option_prefix = self.ksp.getOptionsPrefix()
# self.opts[f"{self.option_prefix}ksp_type"] = "gmres" # Krylov solver type: "cg" or "gmres" Chebyshev
# self.opts[f"{self.option_prefix}pc_type"] = "gamg" # Preconditioner type "gamg" ilu lu
# self.opts[f"{self.option_prefix}pc_factor_mat_solver_type"] = "mumps"
# # Mat solver type for factorization
self.ksp.setFromOptions()
self.ksp.setConvergenceHistory()
# self.ksp.setResidualNorm()
[docs]
def save_log_info(self, logger):
"""
Save the configuration settings of the NewtonSolver and Krylov solver to a logger.
Parameters
----------
logger : logging.Logger
The logger to save the information to.
"""
logger.info("Newton Solver settings:")
logger.info(f" Convergence criterion: {self.solver.convergence_criterion}")
logger.info(f" Absolute tolerance: {self.solver.atol}")
logger.info(f" Relative tolerance: {self.solver.rtol}")
logger.info(f" Maximum iterations: {self.solver.max_it}")
logger.info("KSP settings:")
# logger.info(f" KSP type: {self.opts[f'{self.option_prefix}ksp_type']}")
# logger.info(f" PC type: {self.opts[f'{self.option_prefix}pc_type']}")
# logger.info(f" PC factor mat solver type: {self.opts[f'{self.option_prefix}pc_factor_mat_solver_type']}")
def __str__(self):
"""
Get a human-readable representation of the NewtonSolver's configuration.
Returns
-------
str
A string representing the configuration settings.
"""
config_str = "Newton Solver Configuration:\n"
config_str += f" Convergence criterion: {self.solver.convergence_criterion}\n"
config_str += f" Absolute tolerance: {self.solver.atol}\n"
config_str += f" Relative tolerance: {self.solver.rtol}\n"
config_str += f" Maximum iterations: {self.solver.max_it}\n\n"
config_str += "KSP settings:\n"
config_str += f" KSP type: {self.opts[f'{self.option_prefix}ksp_type']}\n"
config_str += f" PC type: {self.opts[f'{self.option_prefix}pc_type']}\n"
config_str += f" PC factor mat solver type: {self.opts[f'{self.option_prefix}pc_factor_mat_solver_type']}"
return config_str