Iterative Solvers

23. Iterative Solvers#

So far we have used direct solvers to solve the linear system of equations. Although a direct solver can profit from the sparse matrix, it’s arithmetic complexity is sub-optimal. For large-scale problems iterative solvers are a must.

The conjugate gradient (cg) method is the standard method for symmetric and positive definite matrices. It’s convergence rate depends on a preconditioner, what is a cheap approximative inverse to the matrix.

from ngsolve import *
from ngsolve.webgui import Draw
from netgen.webgui import Draw as DrawGeo

We generate a 3D geometry and mesh using the OCC constructive solid geometry (CSG) modeler:

from netgen.occ import *
cube = Box((0,0,0),(1,1,1))
cyl = Cylinder((0,0.5,0.5),X, r=0.2, h=1)
cube.faces.name = "outer"
cyl.faces.name = "cyl"
shape = cube-cyl
DrawGeo(shape);
ngmesh = OCCGeometry(shape).GenerateMesh(maxh=0.1)
for l in range(0):
    ngmesh.Refine()
mesh = Mesh(ngmesh)
mesh.Curve(3)
Draw (mesh);
fes = H1(mesh, order=3, dirichlet="outer", wb_withedges=False)
print ("we have", fes.ndof, "unknowns")
u = fes.TrialFunction()
v = fes.TestFunction()

a = BilinearForm(fes)
a += grad(u)*grad(v)*dx

f = LinearForm(fes)
f += v*dx

# c = Preconditioner(a, "direct", inverse="sparsecholesky")
c = Preconditioner(a, "local")
# c = Preconditioner(a, "bddc")

gfu = GridFunction(fes)
we have 24122 unknowns

assemble system and setup preconditioner in parallel:

ngsglobals.msg_level=0
with TaskManager():
    a.Assemble()
    f.Assemble()

solve the system using the preconditioned conjugate gradient method:

from ngsolve.krylovspace import CGSolver

with TaskManager():
    inv = CGSolver(mat=a.mat, pre=c.mat, printrates='\r', maxiter=1000)
    gfu.vec.data = inv * f.vec
CG iteration 1, residual = 0.04806510211955677     
CG iteration 2, residual = 0.053444916495502     
CG iteration 3, residual = 0.05597869305039374     
CG iteration 4, residual = 0.04586947132393053     
CG iteration 5, residual = 0.030649990803652244     
CG iteration 6, residual = 0.02435013993322333     
CG iteration 7, residual = 0.018971694657541435     
CG iteration 8, residual = 0.013456673742784583     
CG iteration 9, residual = 0.009691378582122127     
CG iteration 10, residual = 0.007602921521580163     
CG iteration 11, residual = 0.006742906370796078     
CG iteration 12, residual = 0.006435687149362539     
CG iteration 13, residual = 0.006371912054367595     
CG iteration 14, residual = 0.006727514653593352     
CG iteration 15, residual = 0.0066272669077910755     
CG iteration 16, residual = 0.005696907354488684     
CG iteration 17, residual = 0.004423754350765523     
CG iteration 18, residual = 0.003360870686622895     
CG iteration 19, residual = 0.0025365970045829     
CG iteration 20, residual = 0.0019181433938188887     
CG iteration 21, residual = 0.001575339597925367     
CG iteration 22, residual = 0.0013996176084161889     
CG iteration 23, residual = 0.0012669872488662375     
CG iteration 24, residual = 0.001138422648981426     
CG iteration 25, residual = 0.0009909055706566808     
CG iteration 26, residual = 0.0008561178275399181     
CG iteration 27, residual = 0.0007149435463959501     
CG iteration 28, residual = 0.0005817165198820662     
CG iteration 29, residual = 0.00048075391554066216     
CG iteration 30, residual = 0.00040195008262801417     
CG iteration 31, residual = 0.00033617615638428046     
CG iteration 32, residual = 0.00026566159073618544     
CG iteration 33, residual = 0.0002074008177649627     
CG iteration 34, residual = 0.00015962402318253163     
CG iteration 35, residual = 0.0001266348010872622     
CG iteration 36, residual = 0.0001020253766882435     
CG iteration 37, residual = 8.520359637808207e-05     
CG iteration 38, residual = 7.637275579162275e-05     
CG iteration 39, residual = 7.031401193856243e-05     
CG iteration 40, residual = 6.352282560116005e-05     
CG iteration 41, residual = 5.616675627864204e-05     
CG iteration 42, residual = 4.750920925331491e-05     
CG iteration 43, residual = 3.862237917134125e-05     
CG iteration 44, residual = 3.075687597761878e-05     
CG iteration 45, residual = 2.3838971486043525e-05     
CG iteration 46, residual = 1.8465192459565432e-05     
CG iteration 47, residual = 1.4431021234217461e-05     
CG iteration 48, residual = 1.1428458487443862e-05     
CG iteration 49, residual = 9.647351724751896e-06     
CG iteration 50, residual = 8.817024336650693e-06     
CG iteration 51, residual = 8.201009184670392e-06     
CG iteration 52, residual = 7.903920342008083e-06     
CG iteration 53, residual = 7.120008835425035e-06     
CG iteration 54, residual = 5.990876658335817e-06     
CG iteration 55, residual = 4.830530488977784e-06     
CG iteration 56, residual = 3.585518265778486e-06     
CG iteration 57, residual = 2.617190718384121e-06     
CG iteration 58, residual = 1.9371172490481443e-06     
CG iteration 59, residual = 1.5340054724924643e-06     
CG iteration 60, residual = 1.3251054146196459e-06     
CG iteration 61, residual = 1.2364901733679553e-06     
CG iteration 62, residual = 1.1974589843712177e-06     
CG iteration 63, residual = 1.1381918221831499e-06     
CG iteration 64, residual = 1.0267510500735406e-06     
CG iteration 65, residual = 8.51913680714246e-07     
CG iteration 66, residual = 6.649806871390992e-07     
CG iteration 67, residual = 5.162332355718122e-07     
CG iteration 68, residual = 3.9962754254619153e-07     
CG iteration 69, residual = 3.1408101147486147e-07     
CG iteration 70, residual = 2.5679117665400196e-07     
CG iteration 71, residual = 2.1860287200207208e-07     
CG iteration 72, residual = 1.935695410243008e-07     
CG iteration 73, residual = 1.7523856001046397e-07     
CG iteration 74, residual = 1.5661887396512742e-07     
CG iteration 75, residual = 1.3935108142987824e-07     
CG iteration 76, residual = 1.2144225860006423e-07     
CG iteration 77, residual = 1.0087258095910313e-07     
CG iteration 78, residual = 8.163338682520468e-08     
CG iteration 79, residual = 6.595563503511998e-08     
CG iteration 80, residual = 5.3322160818572095e-08     
CG iteration 81, residual = 4.2037331069131955e-08     
CG iteration 82, residual = 3.426074314803008e-08     
CG iteration 83, residual = 2.8101988098183667e-08     
CG iteration 84, residual = 2.35131502889402e-08     
CG iteration 85, residual = 1.9782537130399485e-08     
CG iteration 86, residual = 1.7133466708603863e-08     
CG iteration 87, residual = 1.5186927432287135e-08     
CG iteration 88, residual = 1.3602793545580702e-08     
CG iteration 89, residual = 1.2123245439805272e-08     
CG iteration 90, residual = 1.050497380045525e-08     
CG iteration 91, residual = 8.792624352181786e-09     
CG iteration 92, residual = 7.219311352268136e-09     
CG iteration 93, residual = 5.633025875987559e-09     
CG iteration 94, residual = 4.325235977554683e-09     
CG iteration 95, residual = 3.3977823635278343e-09     
CG iteration 96, residual = 2.7698373398809106e-09     
CG iteration 97, residual = 2.3356529759340205e-09     
CG iteration 98, residual = 2.064976356756736e-09     
CG iteration 99, residual = 1.866904277235299e-09     
CG iteration 100, residual = 1.7029693705436699e-09     
CG iteration 101, residual = 1.551455125579699e-09     
CG iteration 102, residual = 1.3426310123813633e-09     
CG iteration 103, residual = 1.1018278936678012e-09     
CG iteration 104, residual = 8.707861280633977e-10     
CG iteration 105, residual = 6.745064541037719e-10     
CG iteration 106, residual = 5.076082733154606e-10     
CG iteration 107, residual = 3.929111853370166e-10     
CG iteration 108, residual = 3.1112939283993103e-10     
CG iteration 109, residual = 2.6499197907839187e-10     
CG iteration 110, residual = 2.3837740059361894e-10     
CG iteration 111, residual = 2.2251820779509425e-10     
CG iteration 112, residual = 2.0885745867283536e-10     
CG iteration 113, residual = 1.888361683936319e-10     
CG iteration 114, residual = 1.6030600456666021e-10     
CG iteration 115, residual = 1.2644204488281104e-10     
CG iteration 116, residual = 9.384521523653833e-11     
CG iteration 117, residual = 6.98487157587891e-11     
CG iteration 118, residual = 5.330742861469242e-11     
CG iteration 119, residual = 4.37890859218301e-11     
CG iteration 120, residual = 3.9251279045917806e-11     
CG iteration 121, residual = 3.694454376564908e-11     
CG iteration 122, residual = 3.594930196760776e-11     
CG iteration 123, residual = 3.4268468059315774e-11     
CG iteration 124, residual = 3.031736370275383e-11     
CG iteration 125, residual = 2.4583982434299916e-11     
CG iteration 126, residual = 1.8459387833035473e-11     
CG iteration 127, residual = 1.3234974834657858e-11     
CG iteration 128, residual = 9.606944862565882e-12     
CG iteration 129, residual = 7.333783985014393e-12     
CG iteration 130, residual = 5.9421107672554985e-12     
CG iteration 131, residual = 5.31758172807534e-12     
CG iteration 132, residual = 5.164923486001904e-12     
CG iteration 133, residual = 5.124502508396253e-12     
CG iteration 134, residual = 4.797712527686117e-12     
CG iteration 135, residual = 4.227760297865007e-12     
CG iteration 136, residual = 3.3084481646570833e-12     
CG iteration 137, residual = 2.409931291615184e-12     
CG iteration 138, residual = 1.7103732707072919e-12     
CG iteration 139, residual = 1.2078577259264404e-12     
CG iteration 140, residual = 9.089564092772272e-13     
CG iteration 141, residual = 7.559728296246099e-13     
CG iteration 142, residual = 6.835630169385947e-13     
CG iteration 143, residual = 6.800444566783949e-13     
CG iteration 144, residual = 6.750410357784796e-13     
CG iteration 145, residual = 6.163906012616172e-13     
CG iteration 146, residual = 5.101655937421897e-13     
CG iteration 147, residual = 3.8071301502229227e-13     
CG iteration 148, residual = 2.75699398723224e-13     
CG iteration 149, residual = 1.958226757558558e-13     
CG iteration 150, residual = 1.4134391404987567e-13     
CG iteration 151, residual = 1.095533051172791e-13     
CG iteration 152, residual = 9.317122386798625e-14     
CG iteration 153, residual = 8.627766920061642e-14     
CG iteration 154, residual = 8.408687814110003e-14     
CG iteration 155, residual = 8.094488514600137e-14     
CG iteration 156, residual = 7.276703711112363e-14     
CG iteration 157, residual = 5.899069395450269e-14     
CG iteration 158, residual = 4.407827028701628e-14     
CG converged in 158 iterations to residual 4.407827028701628e-14
Draw (gfu);