Coverage for /usr/share/miniconda3/envs/dolfin/lib/python3.8/site-packages/block/algebraic/trilinos/AztecOO.py: 0%
35 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
3from builtins import str
4from block.block_base import block_base
6class AztecSolver(block_base):
7 def __init__(self, A, tolerance=1e-5, maxiter=300, solver='cg', precond=None):
8 from PyTrilinos import AztecOO
9 self.A = A # Keep reference
10 self.solver = getattr(AztecOO, 'AZ_'+solver)
11 if isinstance(precond, str):
12 self.precond = getattr(AztecOO, 'AZ_'+precond)
13 else:
14 self.precond = precond
15 self.tolerance = tolerance
16 self.maxiter = maxiter
18 def matvec(self, b):
19 from PyTrilinos import AztecOO
20 from dolfin import GenericVector
21 if not isinstance(b, GenericVector):
22 return NotImplemented
23 x = self.A.create_vec(dim=1)
24 if len(x) != len(b):
25 raise RuntimeError(
26 'incompatible dimensions for AztecOO matvec, %d != %d'%(len(x),len(b)))
28 solver = AztecOO.AztecOO(self.A.down_cast().mat(), x.down_cast().vec(), b.down_cast().vec())
29 #solver.SetAztecDefaults()
30 solver.SetAztecOption(AztecOO.AZ_solver, self.solver)
31 if self.precond:
32 if hasattr(self.precond, 'down_cast'):
33 solver.SetPrecOperator(self.precond.down_cast())
34 else:
35 # doesn't seem to work very well
36 solver.SetAztecOption(AztecOO.AZ_precond, self.precond)
37 # the following are from the example with precond='dom_decomp'
38 solver.SetAztecOption(AztecOO.AZ_subdomain_solve, AztecOO.AZ_ilu)
39 solver.SetAztecOption(AztecOO.AZ_overlap, 1)
40 solver.SetAztecOption(AztecOO.AZ_graph_fill, 1)
42 solver.SetAztecOption(AztecOO.AZ_output, 0)
43 solver.Iterate(self.maxiter, self.tolerance)
44 return x
46 def __str__(self):
47 return '<%s solver for %s>'%(self.__class__.__name__, str(self.A))