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)