Skip to content

Commit b28b807

Browse files
Issue #1683: Support zarr and zipstore for dump and from_file methods in mf6 model (#1706)
Fixes #1683 # Description This PR salvages the logic from #1686 to dump and import files from zarr and zip store and adds unit tests. # Checklist - [x] Links to correct issue - [x] Update changelog, if changes affect users - [x] PR title starts with ``Issue #nr``, e.g. ``Issue #737`` - [x] Unit tests were added - [x] **If feature added**: Added/extended example - [x] **If feature added**: Added feature to API documentation - [ ] **If pixi.lock was changed**: Ran `pixi run generate-sbom` and committed changes --------- Co-authored-by: Sunny Titus <sunny.titus@deltares.nl>
1 parent ae8ff7c commit b28b807

File tree

16 files changed

+365
-177
lines changed

16 files changed

+365
-177
lines changed

docs/api/changelog.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ Added
2121

2222
- Added :class:`imod.mf6.Viscosity` package to specify the viscosity of the
2323
groundwater flow model.
24+
- Functionality to dump and load MODFLOW 6 simulations to/from zarr and zipstore
25+
formats. See :meth:`imod.mf6.Modflow6Simulation.dump` and
26+
:meth:`imod.mf6.Modflow6Simulation.from_file` for more information.
27+
2428

2529
[1.0.0rc7] - 2025-10-28
2630
-----------------------

docs/api/mf6.rst

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ Discretization
8181
StructuredDiscretization.get_regrid_methods
8282
StructuredDiscretization.regrid_like
8383
StructuredDiscretization.from_file
84-
StructuredDiscretization.to_netcdf
84+
StructuredDiscretization.to_file
8585
StructuredDiscretization.copy
8686
StructuredDiscretization.clip_box
8787
StructuredDiscretization.mask
@@ -91,7 +91,7 @@ Discretization
9191
VerticesDiscretization.get_regrid_methods
9292
VerticesDiscretization.regrid_like
9393
VerticesDiscretization.from_file
94-
VerticesDiscretization.to_netcdf
94+
VerticesDiscretization.to_file
9595
VerticesDiscretization.copy
9696
VerticesDiscretization.clip_box
9797
VerticesDiscretization.mask
@@ -100,7 +100,7 @@ Discretization
100100
TimeDiscretization
101101
TimeDiscretization.write
102102
TimeDiscretization.from_file
103-
TimeDiscretization.to_netcdf
103+
TimeDiscretization.to_file
104104
TimeDiscretization.copy
105105
TimeDiscretization.clip_box
106106
TimeDiscretization.mask
@@ -110,7 +110,7 @@ Discretization
110110
AdaptiveTimeStepping
111111
AdaptiveTimeStepping.write
112112
AdaptiveTimeStepping.from_file
113-
AdaptiveTimeStepping.to_netcdf
113+
AdaptiveTimeStepping.to_file
114114
AdaptiveTimeStepping.copy
115115
AdaptiveTimeStepping.clip_box
116116
AdaptiveTimeStepping.mask
@@ -128,7 +128,7 @@ Model settings
128128
OutputControl.is_budget_output
129129
OutputControl.write
130130
OutputControl.from_file
131-
OutputControl.to_netcdf
131+
OutputControl.to_file
132132
OutputControl.copy
133133
OutputControl.clip_box
134134
OutputControl.mask
@@ -138,7 +138,7 @@ Model settings
138138
Solution
139139
Solution.write
140140
Solution.from_file
141-
Solution.to_netcdf
141+
Solution.to_file
142142
Solution.copy
143143
Solution.clip_box
144144
Solution.mask
@@ -159,7 +159,7 @@ Flow Packages
159159
ApiPackage
160160
ApiPackage.write
161161
ApiPackage.from_file
162-
ApiPackage.to_netcdf
162+
ApiPackage.to_file
163163
ApiPackage.copy
164164
ApiPackage.is_empty
165165
ApiPackage.get_regrid_methods
@@ -169,7 +169,7 @@ Flow Packages
169169
Buoyancy
170170
Buoyancy.write
171171
Buoyancy.from_file
172-
Buoyancy.to_netcdf
172+
Buoyancy.to_file
173173
Buoyancy.copy
174174
Buoyancy.is_empty
175175
Buoyancy.get_regrid_methods
@@ -184,7 +184,7 @@ Flow Packages
184184
ConstantHead.clip_box
185185
ConstantHead.write
186186
ConstantHead.from_file
187-
ConstantHead.to_netcdf
187+
ConstantHead.to_file
188188
ConstantHead.copy
189189
ConstantHead.is_empty
190190
ConstantHead.get_regrid_methods
@@ -196,7 +196,7 @@ Flow Packages
196196
Drainage.clip_box
197197
Drainage.write
198198
Drainage.from_file
199-
Drainage.to_netcdf
199+
Drainage.to_file
200200
Drainage.copy
201201
Drainage.is_empty
202202
Drainage.get_regrid_methods
@@ -208,7 +208,7 @@ Flow Packages
208208
Evapotranspiration.clip_box
209209
Evapotranspiration.write
210210
Evapotranspiration.from_file
211-
Evapotranspiration.to_netcdf
211+
Evapotranspiration.to_file
212212
Evapotranspiration.copy
213213
Evapotranspiration.is_empty
214214
Evapotranspiration.get_regrid_methods
@@ -220,7 +220,7 @@ Flow Packages
220220
GeneralHeadBoundary.clip_box
221221
GeneralHeadBoundary.write
222222
GeneralHeadBoundary.from_file
223-
GeneralHeadBoundary.to_netcdf
223+
GeneralHeadBoundary.to_file
224224
GeneralHeadBoundary.copy
225225
GeneralHeadBoundary.is_empty
226226
GeneralHeadBoundary.get_regrid_methods
@@ -232,7 +232,7 @@ Flow Packages
232232
HorizontalFlowBarrierHydraulicCharacteristic.snap_to_grid
233233
HorizontalFlowBarrierHydraulicCharacteristic.write
234234
HorizontalFlowBarrierHydraulicCharacteristic.from_file
235-
HorizontalFlowBarrierHydraulicCharacteristic.to_netcdf
235+
HorizontalFlowBarrierHydraulicCharacteristic.to_file
236236
HorizontalFlowBarrierHydraulicCharacteristic.copy
237237
HorizontalFlowBarrierHydraulicCharacteristic.is_empty
238238
HorizontalFlowBarrierHydraulicCharacteristic.get_regrid_methods
@@ -244,7 +244,7 @@ Flow Packages
244244
HorizontalFlowBarrierMultiplier.snap_to_grid
245245
HorizontalFlowBarrierMultiplier.write
246246
HorizontalFlowBarrierMultiplier.from_file
247-
HorizontalFlowBarrierMultiplier.to_netcdf
247+
HorizontalFlowBarrierMultiplier.to_file
248248
HorizontalFlowBarrierMultiplier.copy
249249
HorizontalFlowBarrierMultiplier.is_empty
250250
HorizontalFlowBarrierMultiplier.get_regrid_methods
@@ -257,7 +257,7 @@ Flow Packages
257257
HorizontalFlowBarrierResistance.snap_to_grid
258258
HorizontalFlowBarrierResistance.write
259259
HorizontalFlowBarrierResistance.from_file
260-
HorizontalFlowBarrierResistance.to_netcdf
260+
HorizontalFlowBarrierResistance.to_file
261261
HorizontalFlowBarrierResistance.copy
262262
HorizontalFlowBarrierResistance.is_empty
263263
HorizontalFlowBarrierResistance.get_regrid_methods
@@ -273,7 +273,7 @@ Flow Packages
273273
LayeredWell.clip_box
274274
LayeredWell.write
275275
LayeredWell.from_file
276-
LayeredWell.to_netcdf
276+
LayeredWell.to_file
277277
LayeredWell.copy
278278
LayeredWell.is_empty
279279
LayeredWell.get_regrid_methods
@@ -284,7 +284,7 @@ Flow Packages
284284
InitialConditions.clip_box
285285
InitialConditions.write
286286
InitialConditions.from_file
287-
InitialConditions.to_netcdf
287+
InitialConditions.to_file
288288
InitialConditions.copy
289289
InitialConditions.is_empty
290290
InitialConditions.get_regrid_methods
@@ -295,7 +295,7 @@ Flow Packages
295295
NodePropertyFlow.clip_box
296296
NodePropertyFlow.write
297297
NodePropertyFlow.from_file
298-
NodePropertyFlow.to_netcdf
298+
NodePropertyFlow.to_file
299299
NodePropertyFlow.copy
300300
NodePropertyFlow.is_empty
301301
NodePropertyFlow.get_regrid_methods
@@ -307,7 +307,7 @@ Flow Packages
307307
Recharge.clip_box
308308
Recharge.write
309309
Recharge.from_file
310-
Recharge.to_netcdf
310+
Recharge.to_file
311311
Recharge.copy
312312
Recharge.is_empty
313313
Recharge.get_regrid_methods
@@ -321,7 +321,7 @@ Flow Packages
321321
River.clip_box
322322
River.write
323323
River.from_file
324-
River.to_netcdf
324+
River.to_file
325325
River.copy
326326
River.is_empty
327327
River.get_regrid_methods
@@ -333,7 +333,7 @@ Flow Packages
333333
SingleLayerHorizontalFlowBarrierHydraulicCharacteristic.snap_to_grid
334334
SingleLayerHorizontalFlowBarrierHydraulicCharacteristic.write
335335
SingleLayerHorizontalFlowBarrierHydraulicCharacteristic.from_file
336-
SingleLayerHorizontalFlowBarrierHydraulicCharacteristic.to_netcdf
336+
SingleLayerHorizontalFlowBarrierHydraulicCharacteristic.to_file
337337
SingleLayerHorizontalFlowBarrierHydraulicCharacteristic.copy
338338
SingleLayerHorizontalFlowBarrierHydraulicCharacteristic.is_empty
339339
SingleLayerHorizontalFlowBarrierHydraulicCharacteristic.get_regrid_methods
@@ -345,7 +345,7 @@ Flow Packages
345345
SingleLayerHorizontalFlowBarrierMultiplier.snap_to_grid
346346
SingleLayerHorizontalFlowBarrierMultiplier.write
347347
SingleLayerHorizontalFlowBarrierMultiplier.from_file
348-
SingleLayerHorizontalFlowBarrierMultiplier.to_netcdf
348+
SingleLayerHorizontalFlowBarrierMultiplier.to_file
349349
SingleLayerHorizontalFlowBarrierMultiplier.copy
350350
SingleLayerHorizontalFlowBarrierMultiplier.is_empty
351351
SingleLayerHorizontalFlowBarrierMultiplier.get_regrid_methods
@@ -359,7 +359,7 @@ Flow Packages
359359
SingleLayerHorizontalFlowBarrierResistance.snap_to_grid
360360
SingleLayerHorizontalFlowBarrierResistance.write
361361
SingleLayerHorizontalFlowBarrierResistance.from_file
362-
SingleLayerHorizontalFlowBarrierResistance.to_netcdf
362+
SingleLayerHorizontalFlowBarrierResistance.to_file
363363
SingleLayerHorizontalFlowBarrierResistance.copy
364364
SingleLayerHorizontalFlowBarrierResistance.is_empty
365365
SingleLayerHorizontalFlowBarrierResistance.get_regrid_methods
@@ -371,7 +371,7 @@ Flow Packages
371371
SpecificStorage.clip_box
372372
SpecificStorage.write
373373
SpecificStorage.from_file
374-
SpecificStorage.to_netcdf
374+
SpecificStorage.to_file
375375
SpecificStorage.copy
376376
SpecificStorage.is_empty
377377
SpecificStorage.get_regrid_methods
@@ -382,7 +382,7 @@ Flow Packages
382382
StorageCoefficient.clip_box
383383
StorageCoefficient.write
384384
StorageCoefficient.from_file
385-
StorageCoefficient.to_netcdf
385+
StorageCoefficient.to_file
386386
StorageCoefficient.copy
387387
StorageCoefficient.is_empty
388388
StorageCoefficient.get_regrid_methods
@@ -392,14 +392,14 @@ Flow Packages
392392
UnsaturatedZoneFlow.regrid_like
393393
UnsaturatedZoneFlow.write
394394
UnsaturatedZoneFlow.from_file
395-
UnsaturatedZoneFlow.to_netcdf
395+
UnsaturatedZoneFlow.to_file
396396
UnsaturatedZoneFlow.copy
397397
UnsaturatedZoneFlow.is_empty
398398
UnsaturatedZoneFlow.get_regrid_methods
399399
Viscosity
400400
Viscosity.write
401401
Viscosity.from_file
402-
Viscosity.to_netcdf
402+
Viscosity.to_file
403403
Viscosity.copy
404404
Viscosity.is_empty
405405
Viscosity.get_regrid_methods
@@ -415,7 +415,7 @@ Flow Packages
415415
Well.clip_box
416416
Well.write
417417
Well.from_file
418-
Well.to_netcdf
418+
Well.to_file
419419
Well.copy
420420
Well.is_empty
421421
Well.get_regrid_methods
@@ -430,64 +430,64 @@ Transport Packages
430430
AdvectionCentral
431431
AdvectionCentral.write
432432
AdvectionCentral.from_file
433-
AdvectionCentral.to_netcdf
433+
AdvectionCentral.to_file
434434
AdvectionCentral.copy
435435
AdvectionCentral.is_empty
436436
AdvectionCentral.get_regrid_methods
437437
AdvectionTVD
438438
AdvectionTVD.write
439439
AdvectionTVD.from_file
440-
AdvectionTVD.to_netcdf
440+
AdvectionTVD.to_file
441441
AdvectionTVD.copy
442442
AdvectionTVD.is_empty
443443
AdvectionTVD.get_regrid_methods
444444
AdvectionUpstream
445445
AdvectionUpstream.write
446446
AdvectionUpstream.from_file
447-
AdvectionUpstream.to_netcdf
447+
AdvectionUpstream.to_file
448448
AdvectionUpstream.copy
449449
AdvectionUpstream.is_empty
450450
AdvectionUpstream.get_regrid_methods
451451
ConstantConcentration
452452
ConstantConcentration.write
453453
ConstantConcentration.from_file
454-
ConstantConcentration.to_netcdf
454+
ConstantConcentration.to_file
455455
ConstantConcentration.copy
456456
ConstantConcentration.is_empty
457457
ConstantConcentration.get_regrid_methods
458458
Dispersion
459459
Dispersion.write
460460
Dispersion.from_file
461-
Dispersion.to_netcdf
461+
Dispersion.to_file
462462
Dispersion.copy
463463
Dispersion.is_empty
464464
Dispersion.get_regrid_methods
465465
ImmobileStorageTransfer
466466
ImmobileStorageTransfer.write
467467
ImmobileStorageTransfer.from_file
468-
ImmobileStorageTransfer.to_netcdf
468+
ImmobileStorageTransfer.to_file
469469
ImmobileStorageTransfer.copy
470470
ImmobileStorageTransfer.is_empty
471471
ImmobileStorageTransfer.get_regrid_methods
472472
MobileStorageTransfer
473473
MobileStorageTransfer.write
474474
MobileStorageTransfer.from_file
475-
MobileStorageTransfer.to_netcdf
475+
MobileStorageTransfer.to_file
476476
MobileStorageTransfer.copy
477477
MobileStorageTransfer.is_empty
478478
MobileStorageTransfer.get_regrid_methods
479479
MassSourceLoading
480480
MassSourceLoading.write
481481
MassSourceLoading.from_file
482-
MassSourceLoading.to_netcdf
482+
MassSourceLoading.to_file
483483
MassSourceLoading.copy
484484
MassSourceLoading.is_empty
485485
MassSourceLoading.get_regrid_methods
486486
SourceSinkMixing
487487
SourceSinkMixing.from_flow_model
488488
SourceSinkMixing.write
489489
SourceSinkMixing.from_file
490-
SourceSinkMixing.to_netcdf
490+
SourceSinkMixing.to_file
491491
SourceSinkMixing.copy
492492
SourceSinkMixing.is_empty
493493
SourceSinkMixing.get_regrid_methods

imod/common/interfaces/ipackage.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,3 @@ def _is_regridding_supported(self) -> bool:
3434
@abstractmethod
3535
def _is_grid_agnostic_package(self) -> bool:
3636
raise NotImplementedError
37-
38-
@property
39-
@abc.abstractmethod
40-
def pkg_id(self) -> str:
41-
raise NotImplementedError

imod/common/interfaces/ipackagebase.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,8 @@ def dataset(self, value: xr.Dataset) -> None:
2424
@abstractmethod
2525
def _from_dataset(cls, ds: GridDataset):
2626
raise NotImplementedError
27+
28+
@property
29+
@abstractmethod
30+
def pkg_id(self) -> str:
31+
raise NotImplementedError
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import abc
2+
from pathlib import Path
3+
4+
from imod.common.interfaces.ipackagebase import IPackageBase
5+
6+
7+
class IPackageSerializer(metaclass=abc.ABCMeta):
8+
@abc.abstractmethod
9+
def to_file(
10+
self, pkg: IPackageBase, directory: Path, file_name: str, **kwargs
11+
) -> Path:
12+
raise NotImplementedError

imod/common/serializer/__init__.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
from typing import Literal, TypeAlias
2+
3+
from imod.common.interfaces.ipackageserializer import IPackageSerializer
4+
from imod.common.serializer.netcdfserializer import NetCDFSerializer
5+
from imod.common.serializer.zarrserializer import ZarrSerializer
6+
7+
EngineType: TypeAlias = Literal["netcdf4", "zarr", "zarr.zip"]
8+
9+
10+
def create_package_serializer(
11+
engine: EngineType, mdal_compliant: bool = False, crs: str | None = None
12+
) -> IPackageSerializer:
13+
match engine:
14+
case "netcdf4":
15+
return NetCDFSerializer(mdal_compliant=mdal_compliant, crs=crs)
16+
case "zarr":
17+
return ZarrSerializer(use_zip=False)
18+
case "zarr.zip":
19+
return ZarrSerializer(use_zip=True)
20+
case _:
21+
raise ValueError(f"Unrecognized engine: {engine}")

0 commit comments

Comments
 (0)