Skip to content

Commit e654fbe

Browse files
committed
Add tests for mpas_tools.ocean.depth module
1 parent 15faa0e commit e654fbe

File tree

1 file changed

+156
-0
lines changed

1 file changed

+156
-0
lines changed
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
#!/usr/bin/env python
2+
import numpy
3+
import xarray
4+
import os
5+
6+
from mpas_tools.io import write_netcdf
7+
from mpas_tools.ocean.depth import compute_depth, compute_zmid, add_depth, \
8+
add_zmid, write_time_varying_zmid
9+
10+
11+
def create_3d_mesh():
12+
outFileName = 'test_depth_mesh.nc'
13+
if os.path.exists(outFileName):
14+
dsMesh = xarray.open_dataset(outFileName)
15+
else:
16+
dsMesh = xarray.open_dataset(
17+
'mesh_tools/mesh_conversion_tools/test/mesh.QU.1920km.151026.nc')
18+
nCells = dsMesh.sizes['nCells']
19+
nVertLevels = 10
20+
zmax = 1000.
21+
layerThickness = zmax/nVertLevels
22+
dsMesh['refBottomDepth'] = \
23+
('nVertLevels', numpy.linspace(layerThickness, zmax, nVertLevels))
24+
dsMesh['maxLevelCell'] = \
25+
('nCells', nVertLevels*numpy.ones(nCells, dtype=int))
26+
dsMesh['bottomDepth'] = ('nCells', zmax*numpy.ones(nCells))
27+
dsMesh['layerThickness'] = \
28+
(('Time', 'nCells', 'nVertLevels'),
29+
layerThickness*numpy.ones((1, nCells, nVertLevels)))
30+
write_netcdf(dsMesh, 'test_depth_mesh.nc')
31+
32+
return dsMesh
33+
34+
35+
def test_compute_depth():
36+
dsMesh = create_3d_mesh()
37+
depth, depth_bnds = compute_depth(dsMesh.refBottomDepth)
38+
assert numpy.all(numpy.isclose(depth, numpy.linspace(50., 950., 10)))
39+
assert numpy.all(numpy.isclose(depth_bnds[:, 0],
40+
numpy.linspace(0., 900., 10)))
41+
assert numpy.all(numpy.isclose(depth_bnds[:, 1],
42+
numpy.linspace(100., 1000., 10)))
43+
44+
45+
def test_compute_zmid():
46+
dsMesh = create_3d_mesh()
47+
zMid = compute_zmid(dsMesh.bottomDepth, dsMesh.maxLevelCell,
48+
dsMesh.layerThickness, depth_dim='nVertLevels')
49+
50+
assert zMid.dims == ('Time', 'nCells', 'nVertLevels')
51+
52+
depth = zMid.isel(Time=0, nCells=0)
53+
assert numpy.all(numpy.isclose(depth.values,
54+
numpy.linspace(-50., -950., 10)))
55+
56+
57+
def test_add_depth():
58+
dsMesh = create_3d_mesh()
59+
mesh_filename = 'test_depth_mesh.nc'
60+
out_filename = 'test_depth_out.nc'
61+
62+
dsIn = xarray.Dataset()
63+
dsIn['temperature'] = xarray.ones_like(dsMesh.layerThickness)
64+
write_netcdf(dsIn, 'test_depth_in.nc')
65+
66+
# test adding depth coordinate once to the mesh and once to the input file,
67+
# with the mesh passed in separately
68+
for in_filename, coord_filename in [(mesh_filename, None),
69+
('test_depth_in.nc', mesh_filename)]:
70+
add_depth(in_filename, out_filename, coordFileName=coord_filename)
71+
dsOut = xarray.open_dataset(out_filename)
72+
assert 'depth' in dsOut.dims
73+
74+
depth = dsOut.depth
75+
assert numpy.all(numpy.isclose(depth.values,
76+
numpy.linspace(50., 950., 10)))
77+
78+
79+
def test_add_zmid():
80+
dsMesh = create_3d_mesh()
81+
mesh_filename = 'test_depth_mesh.nc'
82+
out_filename = 'test_depth_out.nc'
83+
84+
dsIn = xarray.Dataset()
85+
dsIn['temperature'] = xarray.ones_like(dsMesh.layerThickness)
86+
write_netcdf(dsIn, 'test_depth_in.nc')
87+
88+
# test adding zMid once to the mesh and once to the input file, with the
89+
# mesh passed in separately
90+
for in_filename, coord_filename in [(mesh_filename, None),
91+
('test_depth_in.nc', mesh_filename)]:
92+
add_zmid(in_filename, out_filename, coordFileName=coord_filename)
93+
dsOut = xarray.open_dataset(out_filename)
94+
assert 'depth' in dsOut.dims
95+
96+
zMid = dsOut.zMid
97+
assert zMid.dims == ('nCells', 'depth')
98+
99+
depth = zMid.isel(nCells=0)
100+
assert numpy.all(numpy.isclose(depth.values,
101+
numpy.linspace(-50., -950., 10)))
102+
103+
104+
def test_write_time_varying_zmid():
105+
106+
dsMesh = create_3d_mesh()
107+
nCells = dsMesh.sizes['nCells']
108+
nVertLevels = dsMesh.sizes['nVertLevels']
109+
mesh_filename = 'test_depth_mesh.nc'
110+
in_filename = 'test_depth_in.nc'
111+
out_filename = 'test_depth_out.nc'
112+
113+
layerThickness = 100.
114+
115+
# test adding zMid once to the mesh and once to the input file, with the
116+
# mesh passed in separately, each one without and once with a prefix
117+
for coord_filename, prefix in [(None, ''),
118+
(mesh_filename, ''),
119+
(None, 'timeMonthly_avg_'),
120+
(mesh_filename, 'timeMonthly_avg_')]:
121+
print(coord_filename, prefix)
122+
123+
if coord_filename is None:
124+
dsIn = dsMesh.drop_vars('layerThickness')
125+
else:
126+
dsIn = xarray.Dataset()
127+
layerThicknessVar = '{}layerThickness'.format(prefix)
128+
dsIn[layerThicknessVar] = \
129+
(('Time', 'nCells', 'nVertLevels'),
130+
layerThickness*numpy.ones((2, nCells, nVertLevels)))
131+
dsIn['{}temperature'.format(prefix)] = \
132+
xarray.ones_like(dsIn[layerThicknessVar])
133+
write_netcdf(dsIn, in_filename)
134+
dsIn.close()
135+
136+
write_time_varying_zmid(in_filename, out_filename,
137+
coordFileName=coord_filename, prefix=prefix)
138+
139+
dsOut = xarray.open_dataset(out_filename)
140+
assert 'depth' in dsOut.dims
141+
142+
zMid = dsOut['{}zMid'.format(prefix)]
143+
assert zMid.dims == ('Time', 'nCells', 'depth')
144+
145+
depth = zMid.isel(Time=0, nCells=0)
146+
assert numpy.all(numpy.isclose(depth.values,
147+
numpy.linspace(-50., -950., 10)))
148+
dsOut.close()
149+
150+
151+
if __name__ == '__main__':
152+
test_compute_depth()
153+
test_compute_zmid()
154+
test_add_depth()
155+
test_add_zmid()
156+
test_write_time_varying_zmid()

0 commit comments

Comments
 (0)