|
1 | 1 | import sys |
2 | | -from pathlib import Path |
3 | 2 |
|
4 | | -import numpy as np |
5 | 3 | from pydantic import ValidationError |
6 | 4 |
|
7 | | -from modflow_devtools.netcdf import ( |
8 | | - DNODATA, |
9 | | - FILLNA_FLOAT64, |
10 | | - FILLNA_INT32, |
11 | | - NetCDFModelInput, |
12 | | - NetCDFPackageCfg, |
13 | | -) |
14 | 5 | from modflow_devtools.netcdf_schema import validate |
15 | 6 |
|
16 | 7 |
|
@@ -209,272 +200,3 @@ def test_fail_param_attr_input(): |
209 | 200 | print(f"Exception Value: {exc_value}") |
210 | 201 | print(f"Traceback Object: {exc_traceback}") |
211 | 202 | assert "modflow_input" in str(e) |
212 | | - |
213 | | - |
214 | | -def test_xarray_structured_mesh(): |
215 | | - nc_input = NetCDFModelInput( |
216 | | - name="twri", |
217 | | - type="gwf", |
218 | | - grid_type="structured", |
219 | | - dims=[2, 4, 3, 2], # ["time", "z", "y", "x"] |
220 | | - ) |
221 | | - |
222 | | - nc_input.packages.append(NetCDFPackageCfg("npf", "npf", params=["k", "k22"])) |
223 | | - nc_input.packages.append(NetCDFPackageCfg("welg_0", "welg", params=["q"])) |
224 | | - |
225 | | - ds = nc_input.to_xarray() |
226 | | - |
227 | | - assert ds.attrs["modflow_grid"] == "structured" |
228 | | - assert ds.attrs["modflow_model"] == "gwf6: twri" |
229 | | - assert "mesh" not in ds.attrs |
230 | | - assert "npf_k" in ds |
231 | | - assert "npf_k22" in ds |
232 | | - assert "welg_0_q" in ds |
233 | | - assert np.allclose(ds["npf_k"].values, FILLNA_FLOAT64) |
234 | | - assert np.allclose(ds["npf_k22"].values, FILLNA_FLOAT64) |
235 | | - assert np.allclose(ds["welg_0_q"].values, DNODATA) |
236 | | - assert ds["npf_k"].dims == ("z", "y", "x") |
237 | | - assert ds["npf_k22"].dims == ("z", "y", "x") |
238 | | - assert ds["welg_0_q"].dims == ("time", "z", "y", "x") |
239 | | - assert ds.sizes["time"] == 2 |
240 | | - assert ds.sizes["z"] == 4 |
241 | | - assert ds.sizes["y"] == 3 |
242 | | - assert ds.sizes["x"] == 2 |
243 | | - assert len(ds) == 3 |
244 | | - |
245 | | - nc_fpath = Path.cwd() / "twri.input.nc" |
246 | | - ds.to_netcdf( |
247 | | - nc_fpath, |
248 | | - format="NETCDF4", |
249 | | - engine="netcdf4", |
250 | | - ) |
251 | | - |
252 | | - assert nc_fpath.is_file() |
253 | | - |
254 | | - |
255 | | -def test_xarray_layered_mesh(): |
256 | | - nc_input = NetCDFModelInput( |
257 | | - name="twri", |
258 | | - type="gwf", |
259 | | - grid_type="structured", |
260 | | - mesh_type="layered", |
261 | | - dims=[2, 4, 6], # ["time", "z", "nmesh_face"] |
262 | | - ) |
263 | | - |
264 | | - nc_input.packages.append(NetCDFPackageCfg("npf", "npf", params=["k", "k22"])) |
265 | | - nc_input.packages.append(NetCDFPackageCfg("welg_0", "welg", params=["q"])) |
266 | | - |
267 | | - ds = nc_input.to_xarray() |
268 | | - |
269 | | - assert ds.attrs["modflow_grid"] == "structured" |
270 | | - assert ds.attrs["modflow_model"] == "gwf6: twri" |
271 | | - assert ds.attrs["mesh"] == "layered" |
272 | | - for k in range(4): |
273 | | - layer = k + 1 |
274 | | - assert f"npf_k_l{layer}" in ds |
275 | | - assert f"npf_k22_l{layer}" in ds |
276 | | - assert f"welg_0_q_l{layer}" in ds |
277 | | - assert np.allclose(ds[f"npf_k_l{layer}"].values, FILLNA_FLOAT64) |
278 | | - assert np.allclose(ds[f"npf_k22_l{layer}"].values, FILLNA_FLOAT64) |
279 | | - assert np.allclose(ds[f"welg_0_q_l{layer}"].values, DNODATA) |
280 | | - assert ds[f"npf_k_l{layer}"].dims == ("z", "nmesh_face") |
281 | | - assert ds[f"npf_k22_l{layer}"].dims == ("z", "nmesh_face") |
282 | | - assert ds[f"welg_0_q_l{layer}"].dims == ("time", "z", "nmesh_face") |
283 | | - assert ds.sizes["time"] == 2 |
284 | | - assert ds.sizes["z"] == 4 |
285 | | - assert ds.sizes["nmesh_face"] == 6 |
286 | | - assert len(ds) == 12 |
287 | | - |
288 | | - nc_fpath = Path.cwd() / "twri.input.nc" |
289 | | - ds.to_netcdf( |
290 | | - nc_fpath, |
291 | | - format="NETCDF4", |
292 | | - engine="netcdf4", |
293 | | - ) |
294 | | - |
295 | | - assert nc_fpath.is_file() |
296 | | - |
297 | | - |
298 | | -def test_xarray_disv(): |
299 | | - nc_input = NetCDFModelInput( |
300 | | - name="twri", |
301 | | - type="gwf", |
302 | | - grid_type="vertex", |
303 | | - mesh_type="layered", |
304 | | - dims=[2, 4, 6], |
305 | | - ) |
306 | | - |
307 | | - nc_input.packages.append(NetCDFPackageCfg("npf", "npf", params=["k", "k22"])) |
308 | | - nc_input.packages.append(NetCDFPackageCfg("welg_0", "welg", params=["q"])) |
309 | | - |
310 | | - ds = nc_input.to_xarray() |
311 | | - |
312 | | - assert ds.attrs["modflow_grid"] == "vertex" |
313 | | - assert ds.attrs["modflow_model"] == "gwf6: twri" |
314 | | - assert ds.attrs["mesh"] == "layered" |
315 | | - for k in range(4): |
316 | | - layer = k + 1 |
317 | | - assert f"npf_k_l{layer}" in ds |
318 | | - assert f"npf_k22_l{layer}" in ds |
319 | | - assert f"welg_0_q_l{layer}" in ds |
320 | | - assert np.allclose(ds[f"npf_k_l{layer}"].values, FILLNA_FLOAT64) |
321 | | - assert np.allclose(ds[f"npf_k22_l{layer}"].values, FILLNA_FLOAT64) |
322 | | - assert np.allclose(ds[f"welg_0_q_l{layer}"].values, DNODATA) |
323 | | - assert ds[f"npf_k_l{layer}"].dims == ("z", "nmesh_face") |
324 | | - assert ds[f"npf_k22_l{layer}"].dims == ("z", "nmesh_face") |
325 | | - assert ds[f"welg_0_q_l{layer}"].dims == ("time", "z", "nmesh_face") |
326 | | - assert ds.sizes["time"] == 2 |
327 | | - assert ds.sizes["z"] == 4 |
328 | | - assert ds.sizes["nmesh_face"] == 6 |
329 | | - assert len(ds) == 12 |
330 | | - |
331 | | - nc_fpath = Path.cwd() / "disv.input.nc" |
332 | | - ds.to_netcdf( |
333 | | - nc_fpath, |
334 | | - format="NETCDF4", |
335 | | - engine="netcdf4", |
336 | | - ) |
337 | | - |
338 | | - assert nc_fpath.is_file() |
339 | | - |
340 | | - |
341 | | -def test_xarray_disv_aux(): |
342 | | - nc_input = NetCDFModelInput( |
343 | | - name="twri", |
344 | | - type="gwf6", |
345 | | - grid_type="vertex", |
346 | | - mesh_type="layered", |
347 | | - dims=[2, 4, 6], |
348 | | - ) |
349 | | - |
350 | | - nc_input.packages.append(NetCDFPackageCfg("npf", "npf", params=["k", "k22"])) |
351 | | - nc_input.packages.append( |
352 | | - NetCDFPackageCfg( |
353 | | - "welg_0", |
354 | | - "welg", |
355 | | - auxiliary=["concentration", "temperature"], |
356 | | - params=["q", "aux"], |
357 | | - ) |
358 | | - ) |
359 | | - |
360 | | - ds = nc_input.to_xarray() |
361 | | - |
362 | | - assert ds.attrs["modflow_grid"] == "vertex" |
363 | | - assert ds.attrs["modflow_model"] == "gwf6: twri" |
364 | | - assert ds.attrs["mesh"] == "layered" |
365 | | - for k in range(4): |
366 | | - layer = k + 1 |
367 | | - assert f"npf_k_l{layer}" in ds |
368 | | - assert f"npf_k22_l{layer}" in ds |
369 | | - assert f"welg_0_q_l{layer}" in ds |
370 | | - assert f"welg_0_concentration_l{layer}" in ds |
371 | | - assert f"welg_0_temperature_l{layer}" in ds |
372 | | - assert np.allclose(ds[f"npf_k_l{layer}"].values, FILLNA_FLOAT64) |
373 | | - assert np.allclose(ds[f"npf_k22_l{layer}"].values, FILLNA_FLOAT64) |
374 | | - assert np.allclose(ds[f"welg_0_q_l{layer}"].values, DNODATA) |
375 | | - assert np.allclose(ds[f"welg_0_concentration_l{layer}"].values, DNODATA) |
376 | | - assert np.allclose(ds[f"welg_0_temperature_l{layer}"].values, DNODATA) |
377 | | - assert ds[f"npf_k_l{layer}"].dims == ("z", "nmesh_face") |
378 | | - assert ds[f"npf_k22_l{layer}"].dims == ("z", "nmesh_face") |
379 | | - assert ds[f"welg_0_q_l{layer}"].dims == ("time", "z", "nmesh_face") |
380 | | - assert ds[f"welg_0_concentration_l{layer}"].dims == ("time", "z", "nmesh_face") |
381 | | - assert ds[f"welg_0_temperature_l{layer}"].dims == ("time", "z", "nmesh_face") |
382 | | - assert ds[f"welg_0_concentration_l{layer}"].attrs["modflow_iaux"] == 1 |
383 | | - assert ds[f"welg_0_temperature_l{layer}"].attrs["modflow_iaux"] == 2 |
384 | | - assert ds.sizes["time"] == 2 |
385 | | - assert ds.sizes["z"] == 4 |
386 | | - assert ds.sizes["nmesh_face"] == 6 |
387 | | - assert len(ds) == 20 |
388 | | - |
389 | | - nc_fpath = Path.cwd() / "disv_aux.input.nc" |
390 | | - ds.to_netcdf( |
391 | | - nc_fpath, |
392 | | - format="NETCDF4", |
393 | | - engine="netcdf4", |
394 | | - ) |
395 | | - |
396 | | - assert nc_fpath.is_file() |
397 | | - |
398 | | - |
399 | | -def test_xarray_disv_all_params(): |
400 | | - nc_input = NetCDFModelInput( |
401 | | - name="twri", |
402 | | - type="gwf", |
403 | | - grid_type="vertex", |
404 | | - mesh_type="layered", |
405 | | - dims=[2, 4, 6], |
406 | | - ) |
407 | | - |
408 | | - nc_input.packages.append(NetCDFPackageCfg("npf", "npf")) |
409 | | - nc_input.packages.append(NetCDFPackageCfg("welg_0", "welg")) |
410 | | - # TODO: rcha and evta need netcdf annotation in dfns |
411 | | - # nc_cfg.packages.append(NetCDFPackageCfg("rch0", "rcha")) |
412 | | - |
413 | | - ds = nc_input.to_xarray() |
414 | | - |
415 | | - assert ds.attrs["modflow_grid"] == "vertex" |
416 | | - assert ds.attrs["modflow_model"] == "gwf6: twri" |
417 | | - assert ds.attrs["mesh"] == "layered" |
418 | | - for k in range(4): |
419 | | - layer = k + 1 |
420 | | - assert f"npf_icelltype_l{layer}" in ds |
421 | | - assert f"npf_k_l{layer}" in ds |
422 | | - assert f"npf_k22_l{layer}" in ds |
423 | | - assert f"npf_k33_l{layer}" in ds |
424 | | - assert f"npf_angle1_l{layer}" in ds |
425 | | - assert f"npf_angle2_l{layer}" in ds |
426 | | - assert f"npf_angle3_l{layer}" in ds |
427 | | - assert f"npf_wetdry_l{layer}" in ds |
428 | | - assert f"welg_0_q_l{layer}" in ds |
429 | | - assert np.allclose(ds[f"npf_icelltype_l{layer}"].values, FILLNA_INT32) |
430 | | - assert np.allclose(ds[f"npf_k_l{layer}"].values, FILLNA_FLOAT64) |
431 | | - assert np.allclose(ds[f"npf_k22_l{layer}"].values, FILLNA_FLOAT64) |
432 | | - assert np.allclose(ds[f"npf_k33_l{layer}"].values, FILLNA_FLOAT64) |
433 | | - assert np.allclose(ds[f"npf_angle1_l{layer}"].values, FILLNA_FLOAT64) |
434 | | - assert np.allclose(ds[f"npf_angle2_l{layer}"].values, FILLNA_FLOAT64) |
435 | | - assert np.allclose(ds[f"npf_angle3_l{layer}"].values, FILLNA_FLOAT64) |
436 | | - assert np.allclose(ds[f"npf_wetdry_l{layer}"].values, FILLNA_FLOAT64) |
437 | | - assert np.allclose(ds[f"welg_0_q_l{layer}"].values, DNODATA) |
438 | | - assert ds[f"npf_icelltype_l{layer}"].dims == ("z", "nmesh_face") |
439 | | - assert ds[f"npf_k_l{layer}"].dims == ("z", "nmesh_face") |
440 | | - assert ds[f"npf_k22_l{layer}"].dims == ("z", "nmesh_face") |
441 | | - assert ds[f"npf_k33_l{layer}"].dims == ("z", "nmesh_face") |
442 | | - assert ds[f"npf_angle1_l{layer}"].dims == ("z", "nmesh_face") |
443 | | - assert ds[f"npf_angle2_l{layer}"].dims == ("z", "nmesh_face") |
444 | | - assert ds[f"npf_angle3_l{layer}"].dims == ("z", "nmesh_face") |
445 | | - assert ds[f"npf_wetdry_l{layer}"].dims == ("z", "nmesh_face") |
446 | | - assert ds[f"welg_0_q_l{layer}"].dims == ("time", "z", "nmesh_face") |
447 | | - assert ds.sizes["time"] == 2 |
448 | | - assert ds.sizes["z"] == 4 |
449 | | - assert ds.sizes["nmesh_face"] == 6 |
450 | | - assert len(ds) == 36 |
451 | | - |
452 | | - nc_fpath = Path.cwd() / "disv_all.input.nc" |
453 | | - ds.to_netcdf( |
454 | | - nc_fpath, |
455 | | - format="NETCDF4", |
456 | | - engine="netcdf4", |
457 | | - ) |
458 | | - |
459 | | - assert nc_fpath.is_file() |
460 | | - |
461 | | - |
462 | | -def test_jsonschema(): |
463 | | - from jsonschema import Draft7Validator |
464 | | - |
465 | | - nc_input = NetCDFModelInput( |
466 | | - name="twri", |
467 | | - type="gwf", |
468 | | - grid_type="vertex", |
469 | | - mesh_type="layered", |
470 | | - dims=[2, 4, 6], |
471 | | - ) |
472 | | - |
473 | | - nc_input.packages.append(NetCDFPackageCfg("npf", "npf")) |
474 | | - nc_input.packages.append(NetCDFPackageCfg("welg_0", "welg")) |
475 | | - |
476 | | - schema = nc_input.jsonschema() |
477 | | - assert isinstance(schema, dict) |
478 | | - Draft7Validator.check_schema(schema) # raises if not valid |
479 | | - validator = Draft7Validator(schema) |
480 | | - assert validator.is_valid(nc_input.meta) |
0 commit comments