Source code for flopy.mfusg.mfusgddf

"""
mfusgddf module.

Contains the MfUsgDdf class. Note that the user can access
the MfUsgDdf class as `flopy.mfusg.MfUsgDdf`.
"""

from ..pakbase import Package
from ..utils.flopy_io import line_parse
from ..utils.utils_def import (
    get_unitnumber_from_ext_unit_dict,
    type_from_iterable,
)
from .mfusg import MfUsg


[docs]class MfUsgDdf(Package): """MODFLOW-USG Transport Density Driven Flow (DDF) package class. parameters ---------- model : model object the model object (of type :class:`flopy.mfusg.MfUsg`) to which this package will be added. rhofresh : density of freshwater rhostd : density of standard solution cstd : concentration of standard solution ithickav : a flag indicating if thickness weighted averaging for density term 0 = arithmetic averaging; 1 = thickness weighting averaging imphdd : a flag of hydraulic head term in the density formulation 0 = explicit (on the right-hand side vector) symmetry of the matrix 1 = implicit (on the left-hand side matrix) asymmetric matrix extension : str, optional file extension (default is 'ddf'). unitnumber : int, optional fortran unit number for this package (default is none). filenames : str or list of str filenames to use for the package. if filenames=none the package name will be created using the model name and package extension. if a single string is passed the package will be set to the string. default is none. attributes ---------- methods ------- see also -------- notes ----- examples -------- >>> import flopy >>> m = flopy.mfusg.mfusg() >>> ddf = flopy.mfusg.mfusgddf(m) """ def __init__( self, model, rhofresh=1000.0, rhostd=1025.0, cstd=35.0, ithickav=1, imphdd=0, extension="ddf", unitnumber=None, filenames=None, ): msg = ( "Model object must be of type flopy.mfusg.MfUsg\n" f"but received type: {type(model)}." ) assert isinstance(model, MfUsg), msg # set default unit number of one is not specified if unitnumber is None: unitnumber = self._defaultunit() # call base package constructor super().__init__( model, extension=extension, name=self._ftype(), unit_number=unitnumber, filenames=self._prepare_filenames(filenames), ) self._generate_heading() self.rhofresh = rhofresh self.rhostd = rhostd self.cstd = cstd self.ithickav = ithickav self.imphdd = imphdd self.parent.add_package(self) return
[docs] def write_file(self): """ Write the package file. Returns ------- None """ f = open(self.fn_path, "w") f.write(f"{self.heading}\n") f.write( f" {self.rhofresh:9.2f} {self.rhostd:9.2f} {self.cstd:9.2f}" f" {self.ithickav:9d} {self.imphdd:9d}\n" ) f.close()
[docs] @classmethod def load(cls, f, model, ext_unit_dict=None): """ Load an existing package. Parameters ---------- f : filename or file handle File to load. model : model object The model object (of type :class:`flopy.modflow.mf.Modflow`) to which this package will be added. ext_unit_dict : dictionary, optional If the arrays in the file are specified using EXTERNAL, or older style array control records, then `f` should be a file handle. In this case ext_unit_dict is required, which can be constructed using the function :class:`flopy.utils.mfreadnam.parsenamefile`. Returns ------- ddf : MfUsgDdf object Examples -------- >>> import flopy >>> ml = flopy.mfusg.MfUsg() >>> ddf = flopy.mfusg.MfUsgDdf.load('Henry.ddf', ml) """ msg = ( "Model object must be of type flopy.mfusg.MfUsg\n" f"but received type: {type(model)}." ) assert isinstance(model, MfUsg), msg if model.verbose: print("loading ddf package file...") if model.version != "mfusg": print( "Warning: model version was reset from '{}' to 'mfusg' " "in order to load a DDF file".format(model.version) ) model.version = "mfusg" openfile = not hasattr(f, "read") if openfile: filename = f f = open(filename, "r") # dataset 0 -- header line = f.readline().upper() while line.startswith("#"): line = f.readline().upper() if model.verbose: print(" loading RHOFRESH RHOSTD CSTD ITHICKAV IMPHDD...") ll = line_parse(line) rhofresh = float(ll.pop(0)) rhostd = float(ll.pop(0)) cstd = float(ll.pop(0)) ithickav = type_from_iterable(ll, index=3, _type=int, default_val=1) imphdd = type_from_iterable(ll, index=4, _type=int, default_val=0) if model.verbose: print( f" RHOFRESH {rhofresh} \n RHOSTD {rhostd} \n CSTD {cstd} \n" f" ITHICKAV {ithickav} \n IMPHDD {imphdd}" ) if openfile: f.close() # set package unit number unitnumber, filenames = get_unitnumber_from_ext_unit_dict( model, cls, ext_unit_dict, ) return cls( model, rhofresh=rhofresh, rhostd=rhostd, cstd=cstd, ithickav=ithickav, imphdd=imphdd, unitnumber=unitnumber, filenames=filenames, )
@staticmethod def _ftype(): return "DDF" @staticmethod def _defaultunit(): return 152