Source code for sfepy.parallel.evaluate

"""
PETSc-related parallel evaluation of problem equations.
"""
from sfepy.base.base import Struct
import sfepy.parallel.parallel as pp
from sfepy.discrete.evaluate import Evaluator

[docs] class PETScParallelEvaluator(Evaluator): """ The parallel evaluator of the problem equations for :class:`PETScNonlinearSolver <sfepy.solvers.nls.PETScNonlinearSolver>`. Its methods can be used as the function and Jacobian callbacks of the PETSc SNES (Scalable Nonlinear Equations Solvers). Notes ----- Assumes ``problem.active_only == False``. """ def __init__(self, problem, pdofs, drange, is_overlap, psol, comm, matrix_hook=None, verbose=False): Evaluator.__init__(self, problem, matrix_hook=matrix_hook) Struct.__init__(self, pdofs=pdofs, drange=drange, is_overlap=is_overlap, comm=comm, verbose=verbose) self.psol_i = pp.create_local_petsc_vector(pdofs) self.gather, self.scatter = pp.create_gather_scatter(pdofs, self.psol_i, psol, comm=comm)
[docs] def eval_residual(self, snes, psol, prhs): self.scatter(self.psol_i, psol) rhs_if = Evaluator.eval_residual(self, self.psol_i[...], is_full=True) pp.assemble_rhs_to_petsc(prhs, rhs_if, self.pdofs, self.drange, self.is_overlap, self.comm, verbose=self.verbose)
[docs] def eval_tangent_matrix(self, snes, psol, pmtx, ppmtx): self.scatter(self.psol_i, psol) mtx_if = Evaluator.eval_tangent_matrix(self, self.psol_i[...], is_full=True) pp.assemble_mtx_to_petsc(pmtx, mtx_if, self.pdofs, self.drange, self.is_overlap, self.comm, verbose=self.verbose)