Source code for climlab.process.implicit
from __future__ import division
from climlab.process.time_dependent_process import TimeDependentProcess
[docs]
class ImplicitProcess(TimeDependentProcess):
"""A parent class for modules that use implicit time discretization.
During initialization following attributes are intitialized:
:ivar time_type: is set to ``'implicit'``
:vartype time_type: str
:ivar adjustment: the model state adjustments due to this implicit
subprocess
:vartype adjustment: dict
"""
def __init__(self, **kwargs):
super(ImplicitProcess, self).__init__(**kwargs)
self.time_type = 'implicit'
self.adjustment = {}
[docs]
def _compute(self):
"""Computes the state variable tendencies in time for implicit processes.
To calculate the new state the :func:`_implicit_solver()` method is
called for daughter classes. This however returns the new state of the
variables, not just the tendencies. Therefore, the adjustment is
calculated which is the difference between the new and the old state
and stored in the object's attribute adjustment.
Calculating the new model states through solving the matrix problem
already includes the multiplication with the timestep. The derived
adjustment is divided by the timestep to calculate the implicit
subprocess tendencies, which can be handeled by the
:func:`~climlab.process.time_dependent_process.TimeDependentProcess.compute`
method of the parent
:class:`~climlab.process.time_dependent_process.TimeDependentProcess` class.
:ivar dict adjustment: holding all state variables' adjustments
of the implicit process which are the
differences between the new states (which have
been solved through matrix inversion) and the
old states.
"""
newstate = self._implicit_solver()
adjustment = {}
tendencies = {}
for name, var in self.state.items():
adjustment[name] = newstate[name] - var
tendencies[name] = adjustment[name] / self.timestep
# express the adjustment (already accounting for the finite time step)
# as a tendency per unit time, so that it can be applied along with explicit
self.adjustment = adjustment
self._update_diagnostics(newstate)
return tendencies
[docs]
def _update_diagnostics(self, newstate):
'''This method is called each timestep after the new state is computed
with the implicit solver. Daughter classes can implement this method to
compute any diagnostic quantities using the new state.'''
pass