Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(mvt): add simulation-level support for mover transport #1357

Merged
merged 2 commits into from
Feb 18, 2022
Merged
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
148 changes: 147 additions & 1 deletion flopy/mf6/modflow/mfsimulation.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
VerbosityLevel,
)
from ..mfpackage import MFPackage
from ..modflow import mfgwfgnc, mfgwfmvr, mfims, mfnam, mftdis
from ..modflow import mfgwfgnc, mfgwfmvr, mfgwtmvt, mfims, mfnam, mftdis
from ..utils import binaryfile_utils, mfobservation


Expand Down Expand Up @@ -418,13 +418,15 @@ def __init__(
self._ims_files = {}
self._ghost_node_files = {}
self._mover_files = {}
self._mvt_files = {}
self._other_files = {}
self.structure = fpdata.sim_struct
self.model_type = None

self._exg_file_num = {}
self._gnc_file_num = 0
self._mvr_file_num = 0
self._mvt_file_num = 0

self.simulation_data.mfpath.set_last_accessed_path()

Expand Down Expand Up @@ -924,6 +926,8 @@ def sim_package_list(self):
package_list.append(sim_package)
for sim_package in self._mover_files.values():
package_list.append(sim_package)
for sim_package in self._mvt_files.values():
package_list.append(sim_package)
for sim_package in self._other_files.values():
package_list.append(sim_package)
return package_list
Expand Down Expand Up @@ -999,6 +1003,26 @@ def load_package(
self._mover_files[fname] = mover_file
self._mvr_file_num += 1
return mover_file
elif ftype == "mvt":
if fname not in self._mvt_files:
# Get package type from parent package
if parent_package:
package_abbr = parent_package.package_abbr[0:3]
else:
package_abbr = "GWT"
# build package name and package
mvt_name = f"{package_abbr}-MVT_{self._mvt_file_num}"
mvt_file = mfgwtmvt.ModflowGwtmvt(
self,
filename=fname,
pname=mvt_name,
parent_file=parent_package,
loading_package=True,
)
mvt_file.load(strict)
self._mvt_files[fname] = mvt_file
self._mvt_file_num += 1
return mvt_file
else:
# create package
package_obj = self.package_factory(ftype, "")
Expand Down Expand Up @@ -1279,6 +1303,9 @@ def update_package_filename(self, package, new_name):
self._mover_files[new_name] = self._mover_files.pop(
package.filename
)
if package.filename in self._mvt_files:
self._update_exg_files_mvr(package.filename, new_name)
self._mvt_files[new_name] = self._mvt_files.pop(package.filename)
if package.filename in self._other_files:
self._other_files[new_name] = self._other_files.pop(
package.filename
Expand All @@ -1301,6 +1328,7 @@ def rename_all_packages(self, name):
self._rename_package_group(self._ims_files, name)
self._rename_package_group(self._ghost_node_files, name)
self._rename_package_group(self._mover_files, name)
self._rename_package_group(self._mvt_files, name)
self._rename_package_group(self._other_files, name)
for model in self._models.values():
model.rename_all_packages(name)
Expand Down Expand Up @@ -1334,6 +1362,8 @@ def set_all_data_external(
# set data external for mover packages
for package in self._mover_files.values():
package.set_all_data_external(check_data, external_data_folder)
for package in self._mvt_files.values():
package.set_all_data_external(check_data, external_data_folder)
for package in self._exchange_files.values():
package.set_all_data_external(check_data, external_data_folder)

Expand All @@ -1350,6 +1380,8 @@ def set_all_data_internal(self, check_data=True):
# set data external for mover packages
for package in self._mover_files.values():
package.set_all_data_internal(check_data)
for package in self._mvt_files.values():
package.set_all_data_internal(check_data)
for package in self._exchange_files.values():
package.set_all_data_internal(check_data)

Expand Down Expand Up @@ -1494,6 +1526,48 @@ def write_simulation(
"written.".format(mvr_file)
)

if (
hasattr(exchange_file, "mvt_filerecord")
and exchange_file.mvt_filerecord.has_data()
):
try:
mvt_file = exchange_file.mvt_filerecord.get_data()[0][0]
except MFDataException as mfde:
message = (
"An error occurred while retrieving the mover transport "
"file record from exchange file "
'"{}".'.format(exchange_file.filename)
)
raise MFDataException(
mfdata_except=mfde,
package=exchange_file._get_pname(),
message=message,
)

if mvt_file in self._mvt_files:
if (
self.simulation_data.verbosity_level.value
>= VerbosityLevel.normal.value
):
print(
" writing mvr package {}...".format(
self._mvt_files[mvt_file]._get_pname()
)
)
self._mvt_files[mvt_file].write(
ext_file_action=ext_file_action
)
else:
if (
self.simulation_data.verbosity_level.value
>= VerbosityLevel.normal.value
):
print(
"WARNING: Mover transport file {} not loaded prior to "
"writing. File will not be "
"written.".format(mvt_file)
)

# write other packages
for pp in self._other_files.values():
if (
Expand Down Expand Up @@ -1638,6 +1712,8 @@ def remove_package(self, package_name):
del self._ghost_node_files[package.filename]
if package.filename in self._mover_files:
del self._mover_files[package.filename]
if package.filename in self._mvt_files:
del self._mvt_files[package.filename]
if package.filename in self._other_files:
del self._other_files[package.filename]

Expand Down Expand Up @@ -1726,6 +1802,26 @@ def get_mvr_file(self, filename):
excpt_str = f'MVR file "{filename}" can not be found.'
raise FlopyException(excpt_str)

def get_mvt_file(self, filename):
"""
Get a specified mvt file.

Parameters
----------
filename : str
Name of mover transport file to get

Returns
--------
mover transport package : MFPackage

"""
if filename in self._mvt_files:
return self._mvt_files[filename]
else:
excpt_str = f'MVT file "{filename}" can not be found.'
raise FlopyException(excpt_str)

def get_gnc_file(self, filename):
"""
Get a specified gnc file.
Expand Down Expand Up @@ -1936,6 +2032,23 @@ def _remove_package_by_type(self, package):
)
self._remove_package(self._mover_files[package.filename])
del self._mover_files[package.filename]
elif (
package.package_type.lower() == "mvt"
and package.filename in self._mvt_files
and self._mvt_files[package.filename] in self._packagelist
):
# mvr package with same file name already exists. remove old
# mvr package
if (
self.simulation_data.verbosity_level.value
>= VerbosityLevel.normal.value
):
print(
f"WARNING: mvt package with name {pname} already exists. "
"Replacing existing mvr package."
)
self._remove_package(self._mvt_files[package.filename])
del self._mvt_files[package.filename]
elif (
package.package_type.lower() != "ims"
and pname in self.package_name_dict
Expand Down Expand Up @@ -2019,6 +2132,16 @@ def register_package(
)
package.filename = file_name
self._mover_files[file_name] = package
elif package.package_type.lower() == "mvt":
if package.filename not in self._mvt_files:
self._mvt_files[package.filename] = package
else:
# auto generate a unique file name and register it
file_name = MFFileMgmt.unique_file_name(
package.filename, self._mvt_files
)
package.filename = file_name
self._mvt_files[file_name] = package
elif package.package_type.lower() == "ims":
# default behavior is to register the ims package with the first
# unregistered model
Expand Down Expand Up @@ -2419,6 +2542,29 @@ def _update_exg_file_mvr(self, mvr_filename, new_filename):
mvr_file[0][0] = new_filename
exchange_file.mvr_filerecord.set_data(mvr_file)

def _update_exg_file_mvt(self, mvt_filename, new_filename):
for exchange_file in self._exchange_files.values():
if (
hasattr(exchange_file, "mvt_filerecord")
and exchange_file.mvr_filerecord.has_data()
):
try:
mvt_file = exchange_file.mvt_filerecord.get_data()[0][0]
except MFDataException as mfde:
message = (
"An error occurred while retrieving the transport mover "
"file record from exchange file "
'"{}".'.format(exchange_file.filename)
)
raise MFDataException(
mfdata_except=mfde,
package=exchange_file._get_pname(),
message=message,
)
if mvt_file[0][0] == mvt_filename:
mvt_file[0][0] = new_filename
exchange_file.mvt_filerecord.set_data(mvt_file)

def plot(self, model_list=None, SelPackList=None, **kwargs):
"""
Plot simulation or models.
Expand Down