Source code for flopy.modflow.mfmnwi

from ..pakbase import Package
from ..utils.flopy_io import line_parse, pop_item


[docs]class ModflowMnwi(Package): """ 'Multi-Node Well Information Package Class' Parameters ---------- model : model object The model object (of type :class:`flopy.modflow.mf.Modflow`) to which this package will be added. wel1flag : integer Flag indicating output to be written for each MNW node at the end of each stress period qsumflag :integer Flag indicating output to be written for each multi-node well byndflag :integer Flag indicating output to be written for each MNW node mnwobs :integer Number of multi-node wells for which detailed flow, head, and solute data to be saved wellid_unit_qndflag_qhbflag_concflag : list of lists Containing wells and related information to be output (length : [MNWOBS][4or5]) extension : string Filename extension (default is 'mnwi') unitnumber : int File unit number (default is None). filenames : str or list of str Filenames to use for the package and the output files. If filenames=None the package name will be created using the model name and package extension and the output names will be created using the model name and output extensions. Default is None. Attributes ---------- Methods ------- See Also -------- Notes ----- Examples -------- >>> import flopy >>> ml = flopy.modflow.Modflow() >>> ghb = flopy.modflow.ModflowMnwi(ml, ...) """ def __init__( self, model, wel1flag=None, qsumflag=None, byndflag=None, mnwobs=1, wellid_unit_qndflag_qhbflag_concflag=None, extension="mnwi", unitnumber=None, filenames=None, ): # set default unit number of one is not specified if unitnumber is None: unitnumber = ModflowMnwi._defaultunit() # determine the number of unique unit numbers in dataset 3 unique_units = [] if wellid_unit_qndflag_qhbflag_concflag is not None: for t in wellid_unit_qndflag_qhbflag_concflag: iu = int(t[1]) if iu not in unique_units: unique_units.append(iu) # set filenames nfn = 4 + len(unique_units) filenames = self._prepare_filenames(filenames, nfn) # update external file information with unit_pc output, if necessary if wel1flag is not None: model.add_output_file( wel1flag, fname=filenames[1], extension="wel1", binflag=False, package=self._ftype(), ) else: wel1flag = 0 # update external file information with unit_ts output, if necessary if qsumflag is not None: model.add_output_file( qsumflag, fname=filenames[2], extension="qsum", binflag=False, package=self._ftype(), ) else: qsumflag = 0 # update external file information with ipunit output, if necessary if byndflag is not None: model.add_output_file( byndflag, fname=filenames[3], extension="bynd", binflag=False, package=self._ftype(), ) else: byndflag = 0 for idx, iu in enumerate(unique_units, 4): model.add_output_file( iu, fname=filenames[idx], extension=f"{iu:04d}.mnwobs", binflag=False, package=self._ftype(), ) # call base package constructor super().__init__( model, extension=extension, name=self._ftype(), unit_number=unitnumber, filenames=filenames[0], ) self.url = "mnwi.html" self._generate_heading() # integer flag indicating output to be written for each MNW node at # the end of each stress period self.wel1flag = wel1flag # integer flag indicating output to be written for each multi-node well self.qsumflag = qsumflag # integer flag indicating output to be written for each MNW node self.byndflag = byndflag # number of multi-node wells for which detailed flow, head, and solute # data to be saved self.mnwobs = mnwobs # list of lists containing wells and related information to be # output (length = [MNWOBS][4or5]) self.wellid_unit_qndflag_qhbflag_concflag = ( wellid_unit_qndflag_qhbflag_concflag ) # -input format checks: assert ( self.wel1flag >= 0 ), "WEL1flag must be greater than or equal to zero." assert ( self.qsumflag >= 0 ), "QSUMflag must be greater than or equal to zero." assert ( self.byndflag >= 0 ), "BYNDflag must be greater than or equal to zero." if len(self.wellid_unit_qndflag_qhbflag_concflag) != self.mnwobs: print( "WARNING: number of listed well ids to be " "monitored does not match MNWOBS." ) self.parent.add_package(self)
[docs] @classmethod def load(cls, f, model, nper=None, gwt=False, nsol=1, ext_unit_dict=None): if model.verbose: print("loading mnw2 package file...") structured = model.structured if nper is None: nrow, ncol, nlay, nper = model.get_nrow_ncol_nlay_nper() # otherwise iterations from 0, nper won't run nper = 1 if nper == 0 else nper openfile = not hasattr(f, "read") if openfile: filename = f f = open(filename, "r") # dataset 1 line = line_parse(next(f)) wel1flag, qsumflag, byndflag = map(int, line) if wel1flag > 0: model.add_pop_key_list(wel1flag) if qsumflag > 0: model.add_pop_key_list(qsumflag) if byndflag > 0: model.add_pop_key_list(byndflag) # dataset 2 unique_units = [] mnwobs = pop_item(line_parse(next(f)), int) wellid_unit_qndflag_qhbflag_concflag = [] if mnwobs > 0: for i in range(mnwobs): # dataset 3 line = line_parse(next(f)) wellid = pop_item(line, str) unit = pop_item(line, int) qndflag = pop_item(line, int) qbhflag = pop_item(line, int) tmp = [wellid, unit, qndflag, qbhflag] if gwt and len(line) > 0: tmp.append(pop_item(line, int)) wellid_unit_qndflag_qhbflag_concflag.append(tmp) if unit not in unique_units: unique_units.append(unit) if openfile: f.close() for unit in unique_units: model.add_pop_key_list(unit) # determine specified unit number nfn = 4 + len(unique_units) unitnumber = None filenames = [None for x in range(nfn)] if ext_unit_dict is not None: unitnumber, filenames[0] = model.get_ext_dict_attr( ext_unit_dict, filetype=ModflowMnwi._ftype() ) if wel1flag > 0: iu, filenames[1] = model.get_ext_dict_attr( ext_unit_dict, unit=wel1flag ) if qsumflag > 0: iu, filenames[2] = model.get_ext_dict_attr( ext_unit_dict, unit=qsumflag ) if byndflag > 0: iu, filenames[3] = model.get_ext_dict_attr( ext_unit_dict, unit=byndflag ) idx = 4 for unit in unique_units: iu, filenames[idx] = model.get_ext_dict_attr( ext_unit_dict, unit=unit ) idx += 1 return cls( model, wel1flag=wel1flag, qsumflag=qsumflag, byndflag=byndflag, mnwobs=mnwobs, wellid_unit_qndflag_qhbflag_concflag=wellid_unit_qndflag_qhbflag_concflag, extension="mnwi", unitnumber=unitnumber, filenames=filenames, )
[docs] def check(self, f=None, verbose=True, level=1, checktype=None): """ Check mnwi package data for common errors. Parameters ---------- f : str or file handle String defining file name or file handle for summary file of check method output. If a string is passed a file handle is created. If f is None, check method does not write results to a summary file. (default is None) verbose : bool Boolean flag used to determine if check method results are written to the screen level : int Check method analysis level. If level=0, summary checks are performed. If level=1, full checks are performed. Returns ------- None Examples -------- >>> import flopy >>> m = flopy.modflow.Modflow.load('model.nam') >>> m.mnwi.check() """ chk = self._get_check(f, verbose, level, checktype) if "MNW2" not in self.parent.get_package_list(): desc = "\r MNWI package present without MNW2 package." chk._add_to_summary(type="Warning", value=0, desc=desc) chk.summarize() return chk
[docs] def write_file(self): """ Write the package file. Returns ------- None """ # -open file for writing f = open(self.fn_path, "w") # header not supported # # -write header # f.write('{}\n'.format(self.heading)) # dataset 1 - WEL1flag QSUMflag SYNDflag line = f"{self.wel1flag:10d}" line += f"{self.qsumflag:10d}" line += f"{self.byndflag:10d}\n" f.write(line) # dataset 2 - MNWOBS f.write(f"{self.mnwobs:10d}\n") # dataset 3 - WELLID UNIT QNDflag QBHflag {CONCflag} # (Repeat MNWOBS times) nitems = len(self.wellid_unit_qndflag_qhbflag_concflag[0]) for i, t in enumerate(self.wellid_unit_qndflag_qhbflag_concflag): wellid = t[0] unit = t[1] qndflag = t[2] qhbflag = t[3] assert ( qndflag >= 0 ), "QNDflag must be greater than or equal to zero." assert ( qhbflag >= 0 ), "QHBflag must be greater than or equal to zero." line = f"{wellid:20s} " line += f"{unit:5d} " line += f"{qndflag:5d} " line += f"{qhbflag:5d} " if nitems == 5: concflag = t[4] assert ( 0 <= concflag <= 3 ), "CONCflag must be an integer between 0 and 3." assert isinstance( concflag, int ), "CONCflag must be an integer between 0 and 3." line += f"{concflag:5d} " line += "\n" f.write(line) f.close()
@staticmethod def _ftype(): return "MNWI" @staticmethod def _defaultunit(): return 58