Source code for sfepy.solvers.auto_fallback

from __future__ import absolute_import
from sfepy.base.base import Struct
from sfepy.solvers.solvers import Solver, use_first_available


[docs] class AutoFallbackSolver(Solver): """ Base class for virtual solvers with the automatic fallback. """ _ls_solvers = [] def __new__(cls, conf, **kwargs): """ Choose an available solver from `self._ls_solvers`. Parameters ---------- conf : dict or Struct The solver configuration. **kwargs : keyword arguments Additional solver options, see the particular __init__() methods. """ if isinstance(conf, Struct): dconf = conf.to_dict() else: dconf = conf dconf.pop('kind', None) ls_solvers = [(ls, Struct(**_conf) + Struct(kind=ls) + Struct(**dconf)) for ls, _conf in cls._ls_solvers] return use_first_available(ls_solvers, **kwargs)
[docs] class AutoDirect(AutoFallbackSolver): """The automatically selected linear direct solver. The first available solver from the following list is used: `ls.mumps <sfepy.solvers.ls.MUMPSSolver>`, `ls.scipy_umfpack <sfepy.solvers.ls.ScipyUmfpack>` and `ls.scipy_superlu <sfepy.solvers.ls.ScipySuperLU>`. """ name = 'ls.auto_direct' _ls_solvers = [ ('ls.mumps', {}), ('ls.scipy_umfpack', {}), ('ls.scipy_superlu', {}) ]
[docs] class AutoIterative(AutoFallbackSolver): """The automatically selected linear iterative solver. The first available solver from the following list is used: `ls.petsc <sfepy.solvers.ls.PETScKrylovSolver>` and `ls.scipy_iterative <sfepy.solvers.ls.ScipyIterative>` """ name = 'ls.auto_iterative' _ls_solvers = [ ('ls.petsc', {'method': 'cg', 'precond': 'icc'}), ('ls.scipy_iterative', {'method': 'cg'}), ]