Skip to content

Commit e1b0d1a

Browse files
committed
finished adding xarray input analysis
1 parent ed1273c commit e1b0d1a

1 file changed

Lines changed: 79 additions & 25 deletions

File tree

mhkit/river/io/d3d.py

Lines changed: 79 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,8 @@ def get_layer_data(
322322
bottom_depth = data["mesh2d_waterdepth"].values[time_index, :]
323323
waterlevel = data["mesh2d_s1"].values[time_index, :]
324324
coords = list(data["waterdepth"].coords)
325-
elif str(list(data[variable].coords)) == "['FlowElem_xcc', 'FlowElem_ycc', 'time']":
325+
elif str(list(data[variable].coords)) == "['FlowElem_xcc', 'FlowElem_ycc', 'time']" or \
326+
str(list(data[variable].coords)) == "['FlowLink_xu', 'FlowLink_yu', 'time']":
326327
cords_to_layers = {
327328
"FlowElem_xcc FlowElem_ycc": {
328329
"name": "laydim",
@@ -336,6 +337,20 @@ def get_layer_data(
336337
bottom_depth = data["waterdepth"].values[time_index, :]
337338
waterlevel = data["s1"].values[time_index, :]
338339
coords = list(data["waterdepth"].coords)
340+
else:
341+
cords_to_layers = {
342+
"FlowElem_xcc FlowElem_ycc LayCoord_cc LayCoord_cc": {
343+
"name": "laydim",
344+
"coords": data.variables["LayCoord_cc"][:],
345+
},
346+
"FlowLink_xu FlowLink_yu": {
347+
"name": "wdim",
348+
"coords": data.variables["LayCoord_w"][:],
349+
},
350+
}
351+
bottom_depth = data["waterdepth"].values[time_index, :]
352+
waterlevel = data["s1"].values[time_index, :]
353+
coords = list(data["waterdepth"].coords)
339354

340355
layer_dim = " ".join(map(str, list(data[variable].coords)[0:2]))
341356

@@ -349,30 +364,54 @@ def get_layer_data(
349364
elif isinstance(data, xr.Dataset):
350365
layer_percentages= cord_sys.values # accumulative
351366

367+
if isinstance(data, netCDF4.Dataset):
368+
if layer_dim == "FlowLink_xu FlowLink_yu":
369+
# interpolate
370+
x_laydim = np.ma.getdata(data.variables[coords[0]][:], False)
371+
y_laydim = np.ma.getdata(data.variables[coords[1]][:], False)
372+
points_laydim = np.array([[x, y] for x, y in zip(x_laydim, y_laydim)])
352373

353-
if layer_dim == "FlowLink_xu FlowLink_yu":
354-
# interpolate
355-
x_laydim = np.ma.getdata(data.variables[coords[0]][:], False)
356-
y_laydim = np.ma.getdata(data.variables[coords[1]][:], False)
357-
points_laydim = np.array([[x, y] for x, y in zip(x_laydim, y_laydim)])
374+
coords_request = str(data.variables[variable].coordinates).split()
375+
x_wdim = np.ma.getdata(data.variables[coords_request[0]][:], False)
376+
y_wdim = np.ma.getdata(data.variables[coords_request[1]][:], False)
377+
points_wdim = np.array([[x, y] for x, y in zip(x_wdim, y_wdim)])
358378

359-
coords_request = str(data.variables[variable].coordinates).split()
360-
x_wdim = np.ma.getdata(data.variables[coords_request[0]][:], False)
361-
y_wdim = np.ma.getdata(data.variables[coords_request[1]][:], False)
362-
points_wdim = np.array([[x, y] for x, y in zip(x_wdim, y_wdim)])
379+
bottom_depth_wdim = interp.griddata(points_laydim, bottom_depth, points_wdim)
380+
water_level_wdim = interp.griddata(points_laydim, waterlevel, points_wdim)
363381

364-
bottom_depth_wdim = interp.griddata(points_laydim, bottom_depth, points_wdim)
365-
water_level_wdim = interp.griddata(points_laydim, waterlevel, points_wdim)
382+
idx_bd = np.where(np.isnan(bottom_depth_wdim))
366383

367-
idx_bd = np.where(np.isnan(bottom_depth_wdim))
384+
for i in idx_bd:
385+
bottom_depth_wdim[i] = interp.griddata(
386+
points_laydim, bottom_depth, points_wdim[i], method="nearest"
387+
)
388+
water_level_wdim[i] = interp.griddata(
389+
points_laydim, waterlevel, points_wdim[i], method="nearest"
390+
)
391+
elif isinstance(data, xr.Dataset):
392+
if layer_dim == "FlowLink_xu FlowLink_yu":
393+
# interpolate
394+
x_laydim = data[coords[0]].values
395+
y_laydim = data[coords[1]].values
396+
points_laydim = np.array([[x, y] for x, y in zip(x_laydim, y_laydim)])
368397

369-
for i in idx_bd:
370-
bottom_depth_wdim[i] = interp.griddata(
371-
points_laydim, bottom_depth, points_wdim[i], method="nearest"
372-
)
373-
water_level_wdim[i] = interp.griddata(
374-
points_laydim, waterlevel, points_wdim[i], method="nearest"
375-
)
398+
coords_request = list(data[variable].coords)[0:2]
399+
x_wdim = data[coords_request[0]].values
400+
y_wdim = data[coords_request[1]].values
401+
points_wdim = np.array([[x, y] for x, y in zip(x_wdim, y_wdim)])
402+
403+
bottom_depth_wdim = interp.griddata(points_laydim, bottom_depth, points_wdim)
404+
water_level_wdim = interp.griddata(points_laydim, waterlevel, points_wdim)
405+
406+
idx_bd = np.where(np.isnan(bottom_depth_wdim))
407+
408+
for i in idx_bd:
409+
bottom_depth_wdim[i] = interp.griddata(
410+
points_laydim, bottom_depth, points_wdim[i], method="nearest"
411+
)
412+
water_level_wdim[i] = interp.griddata(
413+
points_laydim, waterlevel, points_wdim[i], method="nearest"
414+
)
376415

377416
waterdepth = []
378417

@@ -595,8 +634,8 @@ def variable_interpolation(
595634
f"If a string, points must be cells or faces. Got {points}"
596635
)
597636

598-
if not isinstance(data, netCDF4.Dataset):
599-
raise TypeError(f"data must be netCDF4 object. Got {type(data)}")
637+
if not isinstance(data, (netCDF4.Dataset, xr.Dataset)):
638+
raise TypeError(f"data must be netCDF4 or xarray Dataset object. Got {type(data)}")
600639

601640
if not isinstance(to_pandas, bool):
602641
raise TypeError(f"to_pandas must be of type bool. Got: {type(to_pandas)}")
@@ -743,7 +782,8 @@ def get_all_data_points(
743782
bottom_depth = data["mesh2d_waterdepth"].values[time_index, :]
744783
waterlevel = data["mesh2d_s1"].values[time_index, :]
745784
coords = list(data["waterdepth"].coords)
746-
elif str(list(data[variable].coords)) == "['FlowElem_xcc', 'FlowElem_ycc', 'time']":
785+
elif str(list(data[variable].coords)) == "['FlowElem_xcc', 'FlowElem_ycc', 'time']" or \
786+
str(list(data[variable].coords)) == "['FlowLink_xu', 'FlowLink_yu', 'time']":
747787
cords_to_layers = {
748788
"FlowElem_xcc FlowElem_ycc": {
749789
"name": "laydim",
@@ -757,6 +797,20 @@ def get_all_data_points(
757797
bottom_depth = data["waterdepth"].values[time_index, :]
758798
waterlevel = data["s1"].values[time_index, :]
759799
coords = list(data["waterdepth"].coords)
800+
else:
801+
cords_to_layers = {
802+
"FlowElem_xcc FlowElem_ycc LayCoord_cc LayCoord_cc": {
803+
"name": "laydim",
804+
"coords": data.variables["LayCoord_cc"][:],
805+
},
806+
"FlowLink_xu FlowLink_yu": {
807+
"name": "wdim",
808+
"coords": data.variables["LayCoord_w"][:],
809+
},
810+
}
811+
bottom_depth = data["waterdepth"].values[time_index, :]
812+
waterlevel = data["s1"].values[time_index, :]
813+
coords = list(data["waterdepth"].coords)
760814

761815
layer_dim = " ".join(map(str, list(data[variable].coords)[0:2]))
762816

@@ -879,8 +933,8 @@ def turbulent_intensity(
879933
f"value of the max time index {max_time_index}"
880934
)
881935

882-
if not isinstance(data, netCDF4.Dataset):
883-
raise TypeError("data must be netCDF4 object")
936+
if not isinstance(data, (netCDF4.Dataset, xr.Dataset)):
937+
raise TypeError("data must be netCDF4 object or xarray Dataset")
884938

885939
for variable in ["turkin1", "ucx", "ucy", "ucz"]:
886940
if variable not in data.variables.keys():

0 commit comments

Comments
 (0)