Skip to content

Commit f6a4a71

Browse files
mjrenomjreno
authored andcommitted
support modifying netcdf storage
1 parent 0c61f01 commit f6a4a71

File tree

8 files changed

+611
-165
lines changed

8 files changed

+611
-165
lines changed

autotest/regression/test_mf6_netcdf.py

Lines changed: 265 additions & 40 deletions
Large diffs are not rendered by default.
Binary file not shown.

flopy/mf6/data/mfdataarray.py

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1593,21 +1593,20 @@ def plot(
15931593
return axes
15941594

15951595
def _set_storage_netcdf(self, nc_dataset, create=False):
1596-
storage = self._get_storage_obj()
1597-
package_dim = self.data_dimensions.package_dim
1598-
m = package_dim.model_dim[0].model_name
1599-
# TODO: fix, this won't work for multi-packages #NETCDF-DEV
1600-
p = self.structure.get_package()
1601-
n = self.structure.name.lower()
1602-
input_tag = f"{m}/{p}/{n}".lower()
1603-
16041596
if create:
16051597
# add array to netcdf dataset
1606-
data = self._get_data()
1607-
nc_dataset.create_array(p, n, data, self.structure.shape)
1598+
# TODO: fix, this won't work for multi-packages #NETCDF-DEV
1599+
nc_dataset.create_array(
1600+
self.structure.get_package(),
1601+
self.structure.name.lower(),
1602+
self._get_data(),
1603+
self.structure.shape,
1604+
self.structure.longname,
1605+
)
16081606

1607+
storage = self._get_storage_obj()
16091608
storage._set_storage_netcdf(
1610-
nc_dataset, input_tag, self.structure.layered, storage.layer_storage.get_total_size() - 1
1609+
nc_dataset, self.structure.layered, storage.layer_storage.get_total_size() - 1
16111610
)
16121611

16131612

flopy/mf6/data/mfdatastorage.py

Lines changed: 62 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,7 @@ class LayerStorage:
7373
whether the data is stored in a binary file
7474
nc_dataset : ModelNetCDFDataset or None
7575
model netcdf dataset
76-
nc_input_tag : str
77-
parameter netcdf file input tag
78-
nc_layered : bool #NETCDF-DEV verify this is needed
76+
nc_layered : bool
7977
array storage data is layered
8078
8179
Methods
@@ -122,7 +120,6 @@ def __init__(
122120
self.iprn = None
123121
self.binary = False
124122
self.nc_dataset = None
125-
self.nc_input_tag = None
126123
self.nc_layered = False
127124

128125
def set_internal_constant(self):
@@ -212,6 +209,8 @@ class DataStorage:
212209
what internal type is the data stored in (ndarray, recarray, scalar)
213210
layered : bool
214211
is the data layered
212+
netcdf : bool
213+
is the data stored in netcdf
215214
pre_data_comments : string
216215
any comments before the start of the data
217216
comments : dict
@@ -1026,6 +1025,9 @@ def _set_array(
10261025

10271026
success = False
10281027
if preserve_record:
1028+
if self.netcdf and isinstance(data, list):
1029+
# TODO: is this a kludge? #NETCDF-DEV
1030+
data = self._to_ndarray(data, layer)
10291031
if isinstance(data, np.ndarray):
10301032
# try to store while preserving the structure of the
10311033
# existing record
@@ -1126,16 +1128,24 @@ def _set_array_layer(self, data, layer, multiplier, key, preserve_record):
11261128
self.layer_storage[layer].data_storage_type
11271129
== DataStorageType.external_file
11281130
):
1129-
self.store_external(
1130-
self.layer_storage[layer].fname,
1131-
layer,
1132-
self.layer_storage[layer].factor,
1133-
self.layer_storage[layer].iprn,
1134-
data=data,
1135-
do_not_verify=True,
1136-
binary=self.layer_storage[layer].binary,
1137-
preserve_record=preserve_record,
1138-
)
1131+
if self.netcdf:
1132+
self.store_netcdf(
1133+
layer,
1134+
self.layer_storage[layer].factor,
1135+
self.layer_storage[layer].iprn,
1136+
data=data,
1137+
)
1138+
else:
1139+
self.store_external(
1140+
self.layer_storage[layer].fname,
1141+
layer,
1142+
self.layer_storage[layer].factor,
1143+
self.layer_storage[layer].iprn,
1144+
data=data,
1145+
do_not_verify=True,
1146+
binary=self.layer_storage[layer].binary,
1147+
preserve_record=preserve_record,
1148+
)
11391149
else:
11401150
self.store_internal(
11411151
data,
@@ -1152,7 +1162,15 @@ def _set_array_layer(self, data, layer, multiplier, key, preserve_record):
11521162
data[0], data_type
11531163
):
11541164
# store data as const
1155-
self.store_internal(data, layer, True, multiplier, key=key)
1165+
if self.netcdf:
1166+
self.store_netcdf(
1167+
layer,
1168+
self.layer_storage[layer].factor,
1169+
self.layer_storage[layer].iprn,
1170+
data=data,
1171+
)
1172+
else:
1173+
self.store_internal(data, layer, True, multiplier, key=key)
11561174
return True
11571175

11581176
# look for internal and open/close data
@@ -1861,6 +1879,28 @@ def store_external(
18611879
layer_new, fp_relative, print_format, binary
18621880
)
18631881

1882+
def store_netcdf(
1883+
self,
1884+
layer=None,
1885+
multiplier=None,
1886+
print_format=None,
1887+
data=None,
1888+
):
1889+
file_access = MFFileAccessArray(
1890+
self.data_dimensions.structure,
1891+
self.data_dimensions,
1892+
self._simulation_data,
1893+
self._data_path,
1894+
self._stress_period,
1895+
)
1896+
file_access.set_netcdf_array(
1897+
self.layer_storage[layer].nc_dataset,
1898+
self.data_dimensions.structure.get_package(),
1899+
self.data_dimensions.structure.name,
1900+
data,
1901+
layer[0],
1902+
)
1903+
18641904
def set_ext_file_attributes(self, layer, file_path, print_format, binary):
18651905
# point to the external file and set flags
18661906
self.layer_storage[layer].fname = file_path
@@ -1880,12 +1920,11 @@ def point_to_existing_external_file(self, arr_line, layer):
18801920
self.set_ext_file_attributes(layer, data_file, print_format, binary)
18811921
self.layer_storage[layer].factor = multiplier
18821922

1883-
def _set_storage_netcdf(self, nc_dataset, input_tag, layered, layer):
1923+
def _set_storage_netcdf(self, nc_dataset, layered, layer):
18841924
self.netcdf = True
18851925
is_layered = layered and layer > 0
18861926
for idx in self.layer_storage.indexes():
18871927
self.layer_storage[idx].nc_dataset = nc_dataset
1888-
self.layer_storage[idx].nc_input_tag = input_tag
18891928
self.layer_storage[idx].nc_layered = is_layered
18901929
self.layer_storage[
18911930
idx
@@ -2010,9 +2049,10 @@ def external_to_internal(
20102049
# TODO: ensure multiplier only set by open/close #NETCDF-DEV
20112050
for idx in self.layer_storage.indexes():
20122051
data_out = (
2013-
file_access.load_netcdf_array(
2052+
file_access.read_netcdf_array(
20142053
self.layer_storage[layer].nc_dataset,
2015-
self.layer_storage[layer].nc_input_tag,
2054+
self.data_dimensions.structure.get_package(),
2055+
self.data_dimensions.structure.name,
20162056
idx[0],
20172057
)
20182058
)
@@ -2479,9 +2519,10 @@ def _build_full_data(self, apply_multiplier=False):
24792519
else:
24802520
nc_layer = -1
24812521
data_out = (
2482-
file_access.load_netcdf_array(
2522+
file_access.read_netcdf_array(
24832523
self.layer_storage[layer].nc_dataset,
2484-
self.layer_storage[layer].nc_input_tag,
2524+
self.data_dimensions.structure.get_package(),
2525+
self.data_dimensions.structure.name,
24852526
nc_layer,
24862527
)
24872528
* mult

flopy/mf6/data/mffileaccess.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -467,13 +467,24 @@ def read_binary_data_from_file(
467467
fd.close()
468468
return bin_data
469469

470-
def load_netcdf_array(
470+
def read_netcdf_array(
471471
self,
472472
nc_dataset,
473-
nc_tag,
473+
package,
474+
param,
474475
layer,
475476
):
476-
return nc_dataset.array(nc_tag, layer + 1)
477+
return nc_dataset.array(package, param, layer)
478+
479+
def set_netcdf_array(
480+
self,
481+
nc_dataset,
482+
package,
483+
param,
484+
data,
485+
layer,
486+
):
487+
nc_dataset.set_array(package, param, data, layer)
477488

478489
def get_data_string(self, data, data_type, data_indent=""):
479490
layer_data_string = [str(data_indent)]

flopy/mf6/data/mfstructure.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1425,7 +1425,6 @@ def __init__(self, data_item, model_data, package_type, dfn_list):
14251425
or "nodes" in data_item.shape
14261426
or len(data_item.layer_dims) > 1
14271427
)
1428-
# TODO: only gwf, gwt, gwe models NETCDF-DEV
14291428
self.netcdf = (
14301429
("ncol" in data_item.shape
14311430
or "nrow" in data_item.shape

flopy/mf6/utils/createpackages.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,10 +182,10 @@ def build_dfn_string(dfn_list, header, package_abbr, flopy_dict):
182182
# process each line in a data item
183183
for line in data_item:
184184
line = line.strip()
185-
# do not include the description of longname
185+
# do not include the description
186186
if not line.lower().startswith(
187187
"description"
188-
) and not line.lower().startswith("longname"):
188+
):
189189
line = line.replace('"', "'")
190190
line_length += len(line) + 4
191191
if not first_line:

0 commit comments

Comments
 (0)