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

1from __future__ import division 

2 

3from builtins import str 

4from block.block_base import block_base 

5 

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 

17 

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))) 

27 

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) 

41 

42 solver.SetAztecOption(AztecOO.AZ_output, 0) 

43 solver.Iterate(self.maxiter, self.tolerance) 

44 return x 

45 

46 def __str__(self): 

47 return '<%s solver for %s>'%(self.__class__.__name__, str(self.A))