Coverage for /usr/share/miniconda3/envs/dolfin/lib/python3.8/site-packages/block/algebraic/trilinos/MLPrec.py: 0%
44 statements
« prev ^ index » next coverage.py v7.2.1, created at 2023-03-20 13:03 +0000
« prev ^ index » next coverage.py v7.2.1, created at 2023-03-20 13:03 +0000
1from __future__ import division
3#####
4# Original author: Kent Andre Mardal <kent-and@simula.no>
5#####
7from builtins import str
8from builtins import range
9from block.block_base import block_base
11class ML(block_base):
12 def __init__(self, A, parameters=None, pdes=1, nullspace=None):
13 from PyTrilinos.ML import MultiLevelPreconditioner
14 from dolfin import info
15 from time import time
16 T = time()
17 # create the ML preconditioner
18 MLList = {
19 #"max levels" : 30,
20# "ML print final list" : -1,
21 #"ML output" : 10,
22# "coarse: type" : "Amesos-KLU",
23 "smoother: type" : "ML symmetric Gauss-Seidel" ,
24 "smoother: sweeps" : 2,
25# "smoother: damping factor" : 0.8,
26 #"cycle applications" : 2,
27 "prec type" : "MGV",
28# "aggregation: type" : "METIS" ,
29# "aggregation: damping factor": 1.6,
30# "aggregation: smoothing sweeps" : 3,
32 "PDE equations" : pdes,
33# "ML validate parameter list": True,
34# "repartition: enable": 1,
35 }
37 if parameters: MLList.update(parameters)
38 self.A = A # Prevent matrix being deleted
39 self.ml_prec = MultiLevelPreconditioner(A.down_cast().mat(), 0)
40 if nullspace:
41 # Convert to MultiVector if necessary
42 from PyTrilinos import Epetra
43 if not isinstance(nullspace, Epetra.MultiVector):
44 n = len(nullspace)
45 mv = Epetra.MultiVector(nullspace[0].down_cast().vec().Map(), n, False)
46 for i in range(n):
47 mv[i] = Epetra.FEVector(nullspace[i].down_cast().vec())
48 nullspace = mv
49 self.ml_prec.SetParameterListAndNullSpace(MLList, nullspace)
50 else:
51 self.ml_prec.SetParameterList(MLList)
52 self.ml_agg = self.ml_prec.GetML_Aggregate()
53 err = self.ml_prec.ComputePreconditioner()
54 if err:
55 raise RuntimeError('ComputePreconditioner returned %d'%err)
56 info('constructed ML preconditioner in %.2f s'%(time()-T))
58 def matvec(self, b):
59 from dolfin import GenericVector
60 if not isinstance(b, GenericVector):
61 return NotImplemented
62 # apply the ML preconditioner
63 x = self.A.create_vec(dim=1)
64 if len(x) != len(b):
65 raise RuntimeError(
66 'incompatible dimensions for ML matvec, %d != %d'%(len(x),len(b)))
68 err = self.ml_prec.ApplyInverse(b.down_cast().vec(), x.down_cast().vec())
69 if err:
70 raise RuntimeError('ApplyInverse returned %d'%err)
71 return x
73 def down_cast(self):
74 return self.ml_prec
76 def __str__(self):
77 return '<%s prec of %s>'%(self.__class__.__name__, str(self.A))