Skip to content

Commit b4c5aab

Browse files
mjrenomjreno
authored andcommitted
support oc step types
1 parent 3a3a0e2 commit b4c5aab

File tree

2 files changed

+79
-12
lines changed

2 files changed

+79
-12
lines changed

flopy4/mf6/converter/unstructure.py

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -93,26 +93,53 @@ def _hack_structured_grid_dims(
9393
def _hack_period_non_numeric(name: str, value: xr.DataArray) -> dict[str, dict[int, Any]]:
9494
from flopy4.mf6.gwf import Oc
9595

96-
fname = ""
96+
def oc_setting_data(rec, action):
97+
dat = {}
98+
if rec.steps.first:
99+
dat = {kper: "first" for kper in range(value.sizes["nper"])}
100+
key = f"{action} {rec.rtype}"
101+
data[key] = dat
102+
elif rec.steps.last:
103+
dat = {kper: "last" for kper in range(value.sizes["nper"])}
104+
key = f"{action} {rec.rtype}"
105+
data[key] = dat
106+
elif rec.steps.steps:
107+
steps = " ".join(str(x - 1) for x in rec.steps.steps)
108+
dat = {kper: f"steps {steps}" for kper in range(value.sizes["nper"])}
109+
key = f"{action} {rec.rtype}"
110+
data[key] = dat
111+
elif rec.steps.all:
112+
# check last as this defaults to True
113+
dat = {kper: "all" for kper in range(value.sizes["nper"])}
114+
key = f"{action} {rec.rtype}"
115+
data[key] = dat
116+
return dat
117+
97118
data = {}
98119
match value.dtype:
99120
case np.bool:
100-
fname = name # type: ignore
101-
dat = {kper: "" for kper in range(value.sizes["nper"]) if value.values[kper]}
102-
data[fname] = dat
121+
dat = {kper: "" for kper in range(value.sizes["nper"]) if value.values[kper]} # type: ignore
122+
data[name] = dat
103123
case np.dtypes.StringDType():
104124
fname = name.replace("_", " ")
105125
dat = {kper: value.values[kper] for kper in range(value.sizes["nper"])}
106126
data[fname] = dat
107127
case object():
108128
if isinstance(value.values[0], Oc.PrintSaveSetting):
109-
for rec in value.values[0].printrecord:
110-
if rec.steps.all:
111-
dat = {kper: "all" for kper in range(value.sizes["nper"])}
112-
key = f"PRINT {rec.rtype}"
113-
data[key] = dat
114-
# for rec in value.values[0].saverecord:
115-
# print("SaveRecord")
129+
if hasattr(value.values[0], "printrecord") and isinstance(
130+
value.values[0].printrecord, list
131+
):
132+
action = "PRINT"
133+
for rec in value.values[0].printrecord:
134+
key = f"{action} {rec.rtype}"
135+
data[key] = oc_setting_data(rec, action)
136+
if hasattr(value.values[0], "saverecord") and isinstance(
137+
value.values[0].saverecord, list
138+
):
139+
action = "SAVE"
140+
for rec in value.values[0].saverecord: # type: ignore
141+
key = f"{action} {rec.rtype}"
142+
data[key] = oc_setting_data(rec, action)
116143

117144
return data
118145

@@ -209,7 +236,6 @@ def unstructure_component(value: Component) -> dict[str, Any]:
209236

210237
# sort kper order
211238
period_blocks = dict(sorted(period_blocks.items()))
212-
print(period_blocks)
213239

214240
# setup indexed period blocks, combine arrays into datasets
215241
for kper, block in period_blocks.items():

test/test_mf6_codec.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ def test_dumps_sto():
7070
dumped = dumps(COMPONENT_CONVERTER.unstructure(sto))
7171
print("STO dump:")
7272
print(dumped)
73+
assert "BEGIN PERIOD 1\n TRANSIENT" in dumped
74+
assert "BEGIN PERIOD 2\n STEADY_STATE" in dumped
75+
assert "BEGIN PERIOD 3\n TRANSIENT" in dumped
7376
assert dumped
7477

7578
loaded = loads(dumped)
@@ -110,6 +113,44 @@ def test_dumps_oc():
110113
pprint(loaded)
111114

112115

116+
def test_dumps_oc2():
117+
from flopy4.mf6.gwf import Oc
118+
119+
oc = Oc(
120+
dims={"nper": 1},
121+
budget_file="test.bud",
122+
head_file="test.hds",
123+
# save_head={0: "all"},
124+
# save_budget={0: "all"},
125+
perioddata={
126+
0: Oc.PrintSaveSetting(
127+
printrecord=[
128+
Oc.PrintRecord("head", Oc.Steps(first=True)),
129+
# Oc.PrintRecord("budget", Oc.Steps(last=True)),
130+
Oc.PrintRecord("budget", Oc.Steps(steps=(2, 3, 5))),
131+
],
132+
saverecord=[
133+
Oc.SaveRecord("head", Oc.Steps(last=True)),
134+
Oc.SaveRecord("budget", Oc.Steps(first=True)),
135+
],
136+
)
137+
},
138+
)
139+
140+
dumped = dumps(COMPONENT_CONVERTER.unstructure(oc))
141+
print("OC dump:")
142+
print(dumped)
143+
assert "SAVE HEAD last" in dumped
144+
assert "SAVE BUDGET first" in dumped
145+
assert "PRINT HEAD first" in dumped
146+
assert "PRINT BUDGET steps 1 2 4" in dumped
147+
assert dumped
148+
149+
loaded = loads(dumped)
150+
print("OC load:")
151+
pprint(loaded)
152+
153+
113154
def test_dumps_dis():
114155
from flopy4.mf6.gwf import Dis
115156

0 commit comments

Comments
 (0)