Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions docs/examples/quickstart.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
save_budget={"*": "all"},
)

sim.run(verbose=True)

# check CHD
assert chd.data["head"][0, 0] == 1.0
assert chd.data.head.sel(per=0)[99] == 0.0
Expand Down
28 changes: 10 additions & 18 deletions flopy4/mf6/component.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,30 +13,22 @@ class Component(ABC, MutableMapping):
def __attrs_init_subclass__(cls):
COMPONENTS[cls.__name__.lower()] = cls

def __attrs_post_init__(self):
self._where = type(self).__xattree__["where"]

def __getitem__(self, key):
data = getattr(self, self._where)
return data.children[key]
return self.children[key] # type: ignore

def __setitem__(self, key, value):
data = getattr(self, self._where)
if key in data.children:
data.update({key: value})
else:
data = data.assign({key: value})
setattr(self, self._where, data)
self.children[key] = value # type: ignore

def __delitem__(self, key):
data = getattr(self, self._where)
data = data.drop_nodes(key)
setattr(self, self._where, data)
del self.children[key] # type: ignore

def __iter__(self):
data = getattr(self, self._where)
return iter(data.children)
return iter(self.children) # type: ignore

def __len__(self):
data = getattr(self, self._where)
return len(data.children)
return len(self.children) # type: ignore

def write(self) -> None:
# TODO: write with jinja to file
for child in self.children.values(): # type: ignore
child.write()
14 changes: 14 additions & 0 deletions flopy4/mf6/simulation.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
from os import PathLike
from pathlib import Path

from flopy.discretization.modeltime import ModelTime
from modflow_devtools.misc import run_cmd, set_dir
from xattree import field, xattree

from flopy4.mf6.component import Component
Expand Down Expand Up @@ -31,3 +33,15 @@ class Simulation(Component):
@property
def time(self) -> ModelTime:
return self.tdis.to_time()

def run(self, exe: str | PathLike = "mf6", verbose: bool = False) -> None:
"""Run the simulation using the given executable."""
if self.path is None:
raise ValueError(f"Simulation {self.name} has no workspace path.")
with set_dir(self.path):
stdout, stderr, retcode = run_cmd(exe, verbose=verbose)
if retcode != 0:
raise RuntimeError(
f"Simulation {self.name}: {exe} failed to run with returncode " # type: ignore
f"{retcode}, and error message:\n\n{stdout + stderr} "
)
Loading
Loading