Source code for pypint.solvers.cores.explicit_sdc_core

# coding=utf-8
"""

.. moduleauthor:: Torbjörn Klatt <[email protected]>
"""
from pypint.solvers.cores.sdc_solver_core import SdcSolverCore
from pypint.solvers.states.sdc_solver_state import SdcSolverState
from pypint.problems import IProblem
from pypint.utilities import assert_is_instance, assert_named_argument


[docs]class ExplicitSdcCore(SdcSolverCore): """Explicit SDC Core """ name = "Explicit SDC" def __init__(self): super(ExplicitSdcCore, self).__init__()
[docs] def run(self, state, **kwargs): """Explicit Euler step method. .. math:: u_{m+1}^{k+1} = u_m^{k+1} + \\Delta_\\tau \\left( F(t_m, u_m^{k+1}) - F(t_m, u_m^k) \\right) + \\Delta_t I_m^{m+1} \\left( F(\\vec{u}^k) \\right) Parameters ---------- solver_state : :py:class:`.SdcSolverState` """ super(ExplicitSdcCore, self).run(state, **kwargs) assert_is_instance(state, SdcSolverState, descriptor="State", checking_obj=self) assert_named_argument('problem', kwargs, types=IProblem, descriptor="Problem", checking_obj=self) _problem = kwargs['problem'] _previous_step = state.previous_step _previous_iteration_previous_step = self._previous_iteration_previous_step(state) if not _previous_step.rhs_evaluated: _previous_step.rhs = _problem.evaluate_wrt_time(state.current_step.time_point, _previous_step.value) if not _previous_iteration_previous_step.rhs_evaluated: _previous_iteration_previous_step.rhs = \ _problem.evaluate_wrt_time(state.current_step.time_point, _previous_iteration_previous_step.value) # using step-wise formula # Formula: # u_{m+1}^{k+1} = u_m^{k+1} + \Delta_\tau [ F(u_m^{k+1}) - F(u_m^k) ] + \Delta_t I_m^{m+1}(F(u^k)) # Note: \Delta_t is always 1.0 as it's part of the integral state.current_step.value = \ (_previous_step.value + state.current_step.delta_tau * (_previous_step.rhs - _previous_iteration_previous_step.rhs) + state.current_step.integral)
__all__ = ['ExplicitSdcCore']