Source code for pycif.plugins.domains.chimere.utils.make_vcoord
import numpy as np
from .....utils.path import init_dir
[docs]
def make_vcoord(domain):
# Pressures in hPa
nlev = domain.nlev
pmax = domain.pmax
pref = 1000
p1 = domain.p1
dp1 = pref - p1
a = (pref - pmax) / (pref - p1)
# Add or not a buffer layer
sigma_a = []
sigma_b = []
if p1 / pref < domain.buffer_layer < 1:
sigma_b = [domain.buffer_layer] + sigma_b
sigma_a = [0] + sigma_a
nlev -= 1
# Scaling of thickness
x = 1.01
for i in range(30):
f = 1 - a + np.sum(x ** np.arange(1, nlev))
fp = 1 + np.sum((1 + np.arange(2, nlev)) * x ** np.arange(1, nlev - 1))
x -= f / fp
# Generate sigma_a and sigma_b
p = pref
dp = dp1
for i in range(nlev):
p -= dp
dp *= x
ca = max(0, (pmax / pref) * (p1 - p) / (p1 - pmax))
cb = max(0, (p1 / pref) * (p - pmax) / (p1 - pmax))
sigma_a.append(ca)
sigma_b.append(cb)
# Changing sigma_a to traditional CHIMERE unit
sigma_a = np.array(sigma_a) # / 1000
# Dump to VCOORD file
init_dir(f"{domain.workdir}/domain/VCOORD/")
np.savetxt(
f"{domain.workdir}/domain/VCOORD/VCOORD_{domain.nlev}_{p1}_{pmax}",
np.array([sigma_a, sigma_b]).T,
fmt="%10.5f")
# Add sigma_a and sigma_b to domain
domain.sigma_a = np.array(sigma_a)
domain.sigma_b = np.array(sigma_b)