From 8dec38611f764628d1ed710c3e8d5ad4a982ec99 Mon Sep 17 00:00:00 2001 From: wpbonelli Date: Sat, 4 Jul 2026 04:37:10 -0700 Subject: [PATCH] refactor: miscellaneous - drop _ats_active in favor of deriving from self.ats - replace for/else and list-comprehension with next(iter(...)), list(...), and set-comprehension equivalents - collapse repeated startswith() chains for IM/CON suffixes into a single slice check - move a get_input_var_names() call inside a conditional where it's needed - use math.prod instead of a manual accumulator loop --- modflowapi/extensions/apimodel.py | 13 ++++--- modflowapi/extensions/apisimulation.py | 47 ++++---------------------- 2 files changed, 13 insertions(+), 47 deletions(-) diff --git a/modflowapi/extensions/apimodel.py b/modflowapi/extensions/apimodel.py index a29e0b2..1f3d08d 100644 --- a/modflowapi/extensions/apimodel.py +++ b/modflowapi/extensions/apimodel.py @@ -1,3 +1,5 @@ +import math + import numpy as np from ..util import is_exg @@ -35,7 +37,7 @@ def package_list(self): """ Returns a list of package objects for the model """ - return [package for _, package in self.package_dict.items()] + return list(self.package_dict.values()) @property def package_names(self): @@ -46,7 +48,7 @@ def package_names(self): @property def package_types(self): - return list(set([package.pkg_type for package in self.package_list])) + return list({package.pkg_type for package in self.package_list}) def _set_package_names(self): """ @@ -260,8 +262,8 @@ def shape(self): """ Returns a tuple of the model shape """ - ivn = self.mf6.get_input_var_names() if self._shape is None: + ivn = self.mf6.get_input_var_names() shape_vars = gridshape[self.dis_type] shape = [] for var in shape_vars: @@ -280,10 +282,7 @@ def size(self): Returns the number of nodes in the model """ if self._size is None: - size = 1 - for dim in self.shape: - size *= dim - self._size = size + self._size = math.prod(self.shape) return self._size @property diff --git a/modflowapi/extensions/apisimulation.py b/modflowapi/extensions/apisimulation.py index 7266fdc..51c29d0 100644 --- a/modflowapi/extensions/apisimulation.py +++ b/modflowapi/extensions/apisimulation.py @@ -36,9 +36,6 @@ def __init__(self, mf6, models, solutions, exchanges, tdis, ats): self.tdis = tdis self.ats = ats - self._ats_active = True - if ats is None: - self._ats_active = False def __getattr__(self, item): """ @@ -72,7 +69,7 @@ def ats_active(self): Returns a boolean to indicate if the ATS package is used in this simulation. """ - return self._ats_active + return self.ats is not None @property def ats_period(self): @@ -134,9 +131,7 @@ def sln(self): """ if len(self._solutions) > 1: return list(self._solutions.values()) - else: - for sln in self._solutions.values(): - return sln + return next(iter(self._solutions.values())) @property def model_names(self): @@ -158,7 +153,7 @@ def models(self): """ Returns a list of ApiModel objects associated with the simulation """ - return [v for _, v in self._models.items()] + return list(self._models.values()) @property def iteration(self): @@ -283,25 +278,7 @@ def load(mf6): id_var_addr = mf6.get_var_address("ID", name) if name.startswith("SLN"): continue - elif ( - name.startswith("GWFIM") - or name.startswith("GWTIM") - or name.startswith("GWEIM") - or name.startswith("PRTIM") - or name.startswith("CHFIM") - or name.startswith("OLFIM") - or name.startswith("SWFIM") - ): - continue - elif ( - name.startswith("GWFCON") - or name.startswith("GWTCON") - or name.startswith("GWECON") - or name.startswith("PRTCON") - or name.startswith("CHFCON") - or name.startswith("OLFCON") - or name.startswith("SWFCON") - ): + elif name[3:5] in ("IM", "CO"): continue if id_var_addr not in variables: continue @@ -321,22 +298,14 @@ def load(mf6): id_var_addr = mf6.get_var_address("ID", name) if name.lower() in models or name == "TDIS": continue - if ( - name.startswith("GWFIM") - or name.startswith("GWTIM") - or name.startswith("GWEIM") - or name.startswith("PRTIM") - or name.startswith("CHFIM") - or name.startswith("OLFIM") - or name.startswith("SWFIM") - ): + if name[3:5] == "IM": continue if id_var_addr not in variables: continue solution_names.append(t[0]) - idp_names = [i for i in mf6.get_value("__INPUT__/SIM/NAM/SLNMNAMES")] + idp_names = list(mf6.get_value("__INPUT__/SIM/NAM/SLNMNAMES")) solution_types = [ i[:-1].lower() for ix, i in enumerate(mf6.get_value("__INPUT__/SIM/NAM/SLNTYPE")) if idp_names[ix] ] @@ -373,10 +342,8 @@ def load(mf6): if is_exg(name) and exchange_name not in exchange_names: exchange_names.append(exchange_name) - # sim_packages: tdis, gwf-gwf, sln exchanges = {} for exchange_name in exchange_names: - exchange = ApiExchange(mf6, exchange_name) - exchanges[exchange_name.lower()] = exchange + exchanges[exchange_name.lower()] = ApiExchange(mf6, exchange_name) return ApiSimulation(mf6, models, solutions, exchanges, tdis, ats)