Source code for NEDAS.assim_tools.covariance.ensemble
import yaml
import numpy as np
from NEDAS.utils.njit import njit
[docs]
class EnsembleCovariance:
[docs]
def compute_covariance(self,):
pass
# def covariance(x, y, cov_model='ensemble'):
# if cov_model == 'ensemble':
# return None
# elif cov_model == 'static':
# return None
@njit
def ensemble_covariance(state_ens, obs_ens):
"""
Compute ensemble-based covariance between state and observation variables
Inputs:
- state_ens: np.ndarray
State variables, first dimension is ensemble members
- obs_ens: np.ndarray
Observation variables, first dimension is ensemble members
Return:
- state_variance: np.ndarray, shape is same as state_ens.shape[1:]
Variance of state variables
- obs_variance: np.ndarray, shape is same as obs_ens.shape[1:]
Variance of observation variables
- corr: np.ndarray, shape is state_ens.shape[1:]+obs_ens.shape[1:]
Correlation between state and observation variables
"""
nens = state_ens.shape[0]
nens_obs = obs_ens.shape[0]
if nens != nens_obs:
raise ValueError('Ensemble sizes of state and observation must be equal')
# compute variance of state variables
state_variance = np.zeros(state_ens.shape[1:])
for m in range(nens):
state_variance += state_ens[m,...]**2
state_variance /= nens-1
# compute variance of observation variables
obs_variance = np.zeros(obs_ens.shape[1:])
for m in range(nens):
obs_variance += obs_ens[m,...]**2
obs_variance /= nens-1
# compute covariance between state and observation variables
new_shape = state_ens.shape[1:]+obs_ens.shape[1:]
cov = np.zeros(new_shape)
for m in range(nens):
cov += np.outer(state_ens[m,...], obs_ens[m,...]).reshape(new_shape)
cov /= nens-1
# correlation between state and observation variables
corr = cov / np.sqrt(np.outer(state_variance, obs_variance).reshape(new_shape))
return state_variance, obs_variance, corr
#def static_covariance(lookup, h_dist, v_dist, t_dist, ):
#
# return state
[docs]
def covariance_lookup(c):
pass