Skip to content

Commit 816c0d3

Browse files
Read pickup MDS (#351)
* llc regional grid binary writing * pioneer metadata * nesba domain * nesba meta * single mitgcm face * aste1080 metadata; doesnt match aste metadata * reduced nesb domain * update nesb meta * check for single element length vars * rm custom domain metas * avoid error when using MDS from pickups * add pickup meta check * clean up utils test * handle variable data sizes in pickup * fix CI? * comment on update * Update xmitgcm/test/test_utils.py Co-authored-by: Martin Losch <[email protected]> --------- Co-authored-by: Martin Losch <[email protected]>
1 parent 472252b commit 816c0d3

File tree

3 files changed

+101
-11
lines changed

3 files changed

+101
-11
lines changed

xmitgcm/llcreader/llcmodel.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -952,7 +952,12 @@ def _if_not_none(a, b):
952952
data['RF'][sl],
953953
_VAR_METADATA[zv]['attrs'])
954954

955-
ds = ds.update(variables)
955+
# Save vars as dataArray instead of Variables, avoid dim mismatch error
956+
vars_da = {
957+
name: xr.DataArray(v.data, dims=v.dims, attrs=v.attrs)
958+
for name, v in variables.items()
959+
}
960+
ds = ds.assign(**vars_da)
956961

957962
if grid_vars_to_coords:
958963
ds = ds.set_coords(gridlist)

xmitgcm/test/test_utils.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,20 @@
2020
nrecords = [ 1 ];
2121
"""
2222

23+
_pk_meta_content = """ simulation = { 'global_ocean.32x15' };
24+
nDims = [ 2 ];
25+
dimList = [
26+
192, 1, 192,
27+
32, 1, 32
28+
];
29+
dataprec = [ 'float64' ];
30+
nrecords = [ 123 ];
31+
timeStepNumber = [ 72000 ];
32+
nFlds = [ 11 ];
33+
fldList = {
34+
'Uvel ' 'GuNm1 ' 'Vvel ' 'GvNm1 ' 'Theta ' 'GtNm1 ' 'Salt ' 'GsNm1 ' 'EtaN ' 'dEtaHdt ' 'EtaH '
35+
};
36+
"""
2337

2438
def test_parse_meta(tmpdir):
2539
"""Check the parsing of MITgcm .meta into python dictionary."""
@@ -41,6 +55,38 @@ def test_parse_meta(tmpdir):
4155
assert result[k] == v
4256

4357

58+
def test_parse_pickup_meta(tmpdir):
59+
"""Check the parsing of MITgcm pickup .meta into python dictionary."""
60+
61+
from xmitgcm.utils import parse_meta_file
62+
p = tmpdir.join("pickup.0000000000.meta")
63+
p.write(_pk_meta_content)
64+
fname = str(p)
65+
result = parse_meta_file(fname)
66+
expected = {
67+
'basename': 'pickup',
68+
'nDims': 2,
69+
'dimList': [[192, 1, 192], [32, 1, 32]],
70+
'dataprec': np.dtype('float64'),
71+
'nrecords': 123,
72+
'timeStepNumber': '72000',
73+
'nFlds': 11,
74+
'fldList': ['Uvel',
75+
'GuNm1',
76+
'Vvel',
77+
'GvNm1',
78+
'Theta',
79+
'GtNm1',
80+
'Salt',
81+
'GsNm1',
82+
'EtaN',
83+
'dEtaHdt',
84+
'EtaH']
85+
}
86+
for k, v in expected.items():
87+
assert result[k] == v
88+
89+
4490
@pytest.mark.parametrize("dtype", [np.dtype('f8'), np.dtype('f4'), np.dtype('i4')])
4591
def test_read_raw_data(tmpdir, dtype):
4692
"""Check our utility for reading raw data."""

xmitgcm/utils.py

Lines changed: 49 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,11 @@ def parse_meta_file(fname):
6060
if 'fldList' in flds:
6161
flds['fldList'] = [re.match(r"'*(\w+)", g).groups()[0] for g in
6262
re.split(r"'\s+'", flds['fldList'])]
63-
assert flds['nrecords'] == len(flds['fldList'])
63+
if 'nFlds' in flds:
64+
flds['nFlds'] = int(flds['nFlds'])
65+
assert flds['nFlds'] == len(flds['fldList'])
66+
else:
67+
assert flds['nrecords'] == len(flds['fldList'])
6468
return flds
6569

6670
def _get_useful_info_from_meta_file(metafile):
@@ -81,6 +85,10 @@ def _get_useful_info_from_meta_file(metafile):
8185
name = meta['basename']
8286
fldlist = None
8387

88+
if 'pickup' in metafile: # if 'nFlds' in meta:
89+
# reset UVel to be a single 3D field
90+
shape[0]=int( (nrecs-3)/(meta['nFlds']-3) )
91+
8492
return nrecs, shape, name, dtype, fldlist
8593

8694

@@ -287,13 +295,22 @@ def read_mds(fname, iternum=None, use_mmap=None, endian='>', shape=None,
287295
# convert list into dictionary
288296
out = {}
289297
for n, name in enumerate(file_metadata['fldList']):
290-
if ndims == 3:
291-
out[name] = d[n]
292-
elif ndims == 2:
293-
if use_mmap:
294-
out[name] = d[n].reshape((ny,nx))
298+
if 'pickup' in file_metadata['basename']: # pickup file
299+
if "Eta" in name: # 2D variables
300+
if use_mmap:
301+
out[name] = d[n].reshape((ny,nx))
302+
else:
303+
out[name] = d[n][:,0,:]
295304
else:
296-
out[name] = d[n][:,0,:]
305+
out[name] = d[n]
306+
else:
307+
if ndims == 2:
308+
if use_mmap:
309+
out[name] = d[n].reshape((ny,nx))
310+
else:
311+
out[name] = d[n][:,0,:]
312+
elif ndims == 3:
313+
out[name] = d[n]
297314

298315
# --------------- LEGACY --------------------------
299316
# from legacy code (needs to be phased out)
@@ -785,16 +802,38 @@ def read_all_variables(variable_list, file_metadata, use_mmap=False,
785802
786803
"""
787804

805+
local_metadata = file_metadata
788806
out = []
789807
for variable in variable_list:
808+
if 'basename' in local_metadata:
809+
if 'pickup' in local_metadata['basename']: # pickup file
810+
if "Eta" in variable:
811+
chunks="2D"
812+
local_metadata['nDims'] = 2
813+
local_metadata['nz'] = 1
814+
local_metadata['dimList'] = [
815+
file_metadata['dimList'][0],
816+
file_metadata['dimList'][1]
817+
]
818+
else:
819+
chunks="3D"
820+
nz=(local_metadata['nrecords']-3) / (local_metadata['nFlds']-3)
821+
local_metadata['nDims'] = 3
822+
local_metadata['nz'] = nz
823+
local_metadata['dimList'] = [
824+
file_metadata['dimList'][0],
825+
file_metadata['dimList'][1],
826+
[nz,1,nz]
827+
]
828+
790829
if chunks == "2D":
791-
out.append(read_2D_chunks(variable, file_metadata,
830+
out.append(read_2D_chunks(variable, local_metadata,
792831
use_mmap=use_mmap, use_dask=use_dask))
793832
elif chunks == "3D":
794-
out.append(read_3D_chunks(variable, file_metadata,
833+
out.append(read_3D_chunks(variable, local_metadata,
795834
use_mmap=use_mmap, use_dask=use_dask))
796835
elif chunks == "CS":
797-
out.append(read_CS_chunks(variable, file_metadata,
836+
out.append(read_CS_chunks(variable, local_metadata,
798837
use_mmap=use_mmap, use_dask=use_dask))
799838

800839
return out

0 commit comments

Comments
 (0)