-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathOC.py
60 lines (41 loc) · 1.25 KB
/
OC.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
from numpy import __init__ as np
def streamfunction(var,dxy,dz,n_levs):
buffer = np.zeros(var.shape)
print (buffer.shape,dxy.shape,dz.shape)
for i in range(1,n_levs-1,1):
iz=n_levs-1-i
buffer[iz]= buffer[iz+1] -1e-6 * var.isel(depth=iz).values* dxy.values * dz.isel(nav_lev=iz).values
return buffer
def osf_meridional(var,e1,e3,n_levs):
buffer=streamfunction(var,e1,e3,n_levs)
return np.array(buffer) #np.nansum(buffer,axis=2)
def osf_zonal(var,e2,e3,n_levs):
buffer = streamfunction(var, e2, e3, n_levs)
return np.array(buffer) # np.nansum(buffer,axis=1)
def zonalOC(ds, msk):
e2 = msk.e2u.isel(time_counter=0)
e3 = msk.e3u_0.isel(time_counter=0)
u = ds.u[0]
z_levs = ds.depth
n_levs = len(z_levs)
psi = osf_zonal(u, e2,e3,n_levs)
land=np.copy(psi == 0)
psi[land] = np.nan
print(psi.shape,'psi')
u*=np.nan
u[:]=psi
u=u.rename('zoc')
return u
def meridionalOC(ds,msk):
e1 = msk.e1v.isel(time_counter=0)
e3 = msk.e3v_0.isel(time_counter=0)
v = ds.v[0]
z_levs = ds.depth
n_levs = len(z_levs)
psi = osf_meridional(v, e1,e3,n_levs)
land=np.copy(psi == 0)
psi[land] = np.nan
v*=np.nan
v[:]=psi
v=v.rename('moc')
return v