55from petsc4py import PETSc
66
77import basix
8+ import dolfinx
89import numpy as np
910import tqdm .autonotebook
1011from dolfinx .fem import (
1718 locate_dofs_geometrical ,
1819 locate_dofs_topological ,
1920)
20- from dolfinx .fem .petsc import (
21- NonlinearProblem ,
22- )
21+ from dolfinx .fem .petsc import NonlinearProblem
2322from dolfinx .io import XDMFFile
2423from dolfinx .mesh import create_mesh , locate_entities , meshtags
25- from dolfinx .nls .petsc import NewtonSolver
2624from test_permeation_problem import test_permeation_problem
2725from ufl import (
2826 FacetNormal ,
@@ -111,24 +109,28 @@ def siverts_law(T, S_0, E_S, pressure):
111109
112110 dt = 1 / 20
113111 final_time = 50
114- num_steps = int (final_time / dt )
115112
116113 F = dot (D * grad (u ), grad (v )) * dx (1 )
117114 F += ((u - u_n ) / dt ) * v * dx (1 )
118115
119- problem = NonlinearProblem (F , u , bcs = bcs )
120- solver = NewtonSolver (MPI .COMM_WORLD , problem )
121- solver .convergence_criterion = "incremental"
122- solver .rtol = 1e-10
123- solver .atol = 1e10
124- solver .report = True
125- ksp = solver .krylov_solver
126- opts = PETSc .Options ()
127- option_prefix = ksp .getOptionsPrefix ()
128- opts [f"{ option_prefix } ksp_type" ] = "cg"
129- opts [f"{ option_prefix } pc_type" ] = "gamg"
130- opts [f"{ option_prefix } pc_factor_mat_solver_type" ] = "mumps"
131- ksp .setFromOptions ()
116+ petsc_options = {
117+ "snes_type" : "newtonls" ,
118+ "snes_linesearch_type" : "none" ,
119+ "snes_stol" : 1e-8 ,
120+ "snes_atol" : 0 ,
121+ "snes_rtol" : 0 ,
122+ "snes_max_it" : 30 ,
123+ "ksp_type" : "cg" ,
124+ "pc_type" : "gamg" ,
125+ }
126+
127+ solver = NonlinearProblem (
128+ F ,
129+ u ,
130+ bcs = bcs ,
131+ petsc_options = petsc_options ,
132+ petsc_options_prefix = "festim_solver" ,
133+ )
132134
133135 temp_dir = tempfile .TemporaryDirectory ()
134136 mobile_xdmf = XDMFFile (
@@ -146,7 +148,7 @@ def siverts_law(T, S_0, E_S, pressure):
146148 progress .update (float (dt ))
147149 t += float (dt )
148150
149- solver .solve (u )
151+ _ = solver .solve ()
150152
151153 mobile_xdmf .write_function (u , t )
152154
0 commit comments