Source code for fridom.framework.projection.spectral_projections

import fridom.framework as fr

[docs] class GeostrophicSpectral(fr.projection.Projection): """ Projection onto the geostrophic subspace using spectral eigenvectors. Parameters ---------- `mset` : `ModelSettings` The model settings. `use_discrete` : `bool` (default: `True`) Whether to use discrete eigenvectors. """
[docs] def __init__(self, mset: fr.ModelSettingsBase, use_discrete: bool = True) -> None: super().__init__(mset) # Construct the eigenvectors self.q = mset.grid.vec_q(s=0, use_discrete=use_discrete) self.p = mset.grid.vec_p(s=0, use_discrete=use_discrete) return
def __call__(self, z: fr.VectorField) -> fr.VectorField: return z.project(self.p, self.q)
[docs] class WaveSpectral(fr.projection.Projection): """ Projection onto the inertia-gravity wave subspace using spectral eigenvectors. Parameters ---------- `mset` : `ModelSettings` The model settings. `use_discrete` : `bool` (default: `True`) Whether to use discrete eigenvectors. Methods ------- `__call__(z: State) -> State` Project a state to the inertia-gravity wave subspace. """
[docs] def __init__(self, mset: fr.ModelSettingsBase, use_discrete: bool = True) -> None: super().__init__(mset) self.qp = mset.grid.vec_q(1, use_discrete=use_discrete) self.pp = mset.grid.vec_p(1, use_discrete=use_discrete) self.qm = mset.grid.vec_q(-1, use_discrete=use_discrete) self.pm = mset.grid.vec_p(-1, use_discrete=use_discrete)
def __call__(self, z: fr.VectorField) -> fr.VectorField: return z.project(self.pp, self.qp) + z.project(self.pm, self.qm)
[docs] class DivergenceSpectral(fr.projection.Projection): """ Projection onto the divergence subspace using spectral eigenvectors. Parameters ---------- `mset` : `ModelSettings` The model settings. `use_discrete` : `bool` (default: `True`) Whether to use discrete eigenvectors. """
[docs] def __init__(self, mset: fr.ModelSettingsBase, use_discrete: bool = True) -> None: super().__init__(mset) self.q = mset.grid.vec_q(s="d", use_discrete=use_discrete) self.p = mset.grid.vec_p(s="d", use_discrete=use_discrete) return
def __call__(self, z: fr.VectorField) -> fr.VectorField: return z.project(self.p, self.q)