Source code for fridom.nonhydro.modules.main_tendency

"""Main Tendency module for the nonhydrostatic model."""
import fridom.framework as fr
import fridom.nonhydro as nh


[docs] class MainTendency(fr.modules.ModuleContainer): #TODO(Silvano): Add a description of the module. """Main Tendency module for the nonhydrostatic model.""" name = "Main Tendencies: Nonhydrostatic Model"
[docs] def __init__(self) -> None: mods = nh.modules self._reset_tendency = mods.ResetTendency() self._linear_tendency = mods.LinearTendency() self._tendency_divergence = mods.TendencyDivergence() self._advection = mods.advection.CenteredAdvection() self._pressure_solver = mods.pressure_solvers.SpectralPressureSolver() self._pressure_gradient_tendency = mods.PressureGradientTendency() self._additional_modules = [] self._set_module_list() super().__init__(module_list=self.module_list)
def _on_setup(self) -> None: # update the advection module if the grid is spectral if type(self.mset.grid) is nh.grid.spectral.Grid: self.advection = nh.modules.advection.SpectralAdvection()
[docs] def add_module(self, module: fr.modules.Module) -> None: # noqa: D102 self._additional_modules.append(module) self._set_module_list() self._setup_new_module(module)
def _set_module_list(self) -> None: """ Set the module list. Description ----------- This function make sure that the pressure solver and the pressure gradient tendency are always in the last two positions. """ module_list = [] module_list.append(self._reset_tendency) module_list.append(self.linear_tendency) module_list.append(self.advection) module_list += self._additional_modules module_list.append(self.tendency_divergence) module_list.append(self.pressure_solver) module_list.append(self.pressure_gradient_tendency) self.module_list = module_list # ============================================================ # PROPERTIES # ============================================================ @property def linear_tendency(self) -> nh.modules.LinearTendency: """The core linear momentum tendency module.""" return self._linear_tendency @linear_tendency.setter def linear_tendency(self, value: nh.modules.Module) -> None: self._linear_tendency = value self._set_module_list() if self.is_setup: value.setup(mset=self.mset) @property def advection(self) -> nh.modules.advection.AdvectionBase: """The advection module (nonlinear + linear by backgound state).""" if self._advection is None: msg = "The advection module is available after the setup." raise ValueError(msg) return self._advection @advection.setter def advection(self, value: nh.modules.Module) -> None: self._advection = value self._set_module_list() if self.is_setup: value.setup(mset=self.mset) @property def tendency_divergence(self) -> nh.modules.TendencyDivergence: """The divergence of the momentum tendency, for the pressure solver.""" return self._tendency_divergence @tendency_divergence.setter def tendency_divergence(self, value: nh.modules.Module) -> None: self._tendency_divergence = value self._set_module_list() if self.is_setup: value.setup(mset=self.mset) @property def pressure_solver(self) -> nh.modules.Module: """The pressure solver module.""" return self._pressure_solver @pressure_solver.setter def pressure_solver(self, value: nh.modules.Module) -> None: self._pressure_solver = value self._set_module_list() if self.is_setup: value.setup(mset=self.mset) @property def pressure_gradient_tendency(self) -> nh.modules.PressureGradientTendency: """The pressure gradient tendency module.""" return self._pressure_gradient_tendency @pressure_gradient_tendency.setter def pressure_gradient_tendency(self, value: nh.modules.Module) -> None: self._pressure_gradient_tendency = value self._set_module_list() if self.is_setup: value.setup(mset=self.mset)