|
| 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