diff --git a/hysop/iterative_method.py b/hysop/iterative_method.py index b03ff9dcd8d5e9068bee089ba1957fd49b91de13..1b8db492fcba147047bd339957cdcb21be8a5e84 100644 --- a/hysop/iterative_method.py +++ b/hysop/iterative_method.py @@ -4,7 +4,7 @@ from hysop import Simulation, Problem from hysop.parameters.scalar_parameter import ScalarParameter from hysop.tools.contexts import Timer from hysop import dprint, vprint -from hysop.tools.decorators import debug +from hysop.tools.decorators import debug from hysop.core.graph.graph import ready from hysop.constants import HYSOP_REAL, HYSOP_INTEGER from hysop.simulation import eps @@ -13,6 +13,7 @@ from hysop.core.mpi import main_rank, main_size, main_comm import numpy as np import datetime + class PseudoSimulation(Simulation): """Pseudo time-iterations for iterative method""" @@ -80,8 +81,9 @@ class IterativeMethod(Problem): override Problem class in a proper way. Here only a pseudo-timestep is used together with a maximal number of iteration to compute a pseudo-final time. """ + def __init__(self, stop_criteria, tolerance=1e-8, state_print=100, max_iter=10000, - dt0=None, dt=None, **kwargs): + dt0=None, dt=None, configsimu=None, **kwargs): super(IterativeMethod, self).__init__(**kwargs) self.stop_criteria, self.tolerance = stop_criteria, tolerance @@ -104,9 +106,16 @@ class IterativeMethod(Problem): dtype=self.stop_criteria.dtype) self._stop_criteria_reset[...] = 1e10 + self.configsimu = self._default_configsimu + if not configsimu is None: + self.configsimu = configsimu + + def _default_configsimu(self, l, s): + pass + @debug @ready - def apply(self, simulation, configsimu=lambda l:None, report_freq=100, **kwds): + def apply(self, simulation, report_freq=0, **kwds): vprint('=== Entering iterative method...') self.stop_criteria.value = self._stop_criteria_reset @@ -119,8 +128,9 @@ class IterativeMethod(Problem): dt0=self.dt0, dt=self.dt, t=ScalarParameter(name='dummy-t', dtype=HYSOP_REAL, - quiet=True)) - configsimu(loop) + quiet=True), + mpi_params=self.mpi_params) + self.configsimu(loop, simulation) # Usual initialize-loop-finalize sequence : loop.initialize() with Timer() as tm: @@ -140,8 +150,8 @@ class IterativeMethod(Problem): formatter={'float_kind': lambda x: '{:8.8f}'.format(x)}), datetime.timedelta(seconds=round(avg_time)), avg_time, - '' if main_size==1 else ', averaged over {} ranks. '.format(main_size))) - + '' if main_size == 1 else ', averaged over {} ranks. '.format(main_size))) + self.it_num.value = loop.current_iteration loop.finalize() self.final_report()