Source code for flopy.modflow.mfswt

"""
mfswt module.  Contains the ModflowSwt class. Note that the user can access
the ModflowSub class as `flopy.modflow.ModflowSwt`.

Additional information for this MODFLOW package can be found at the `Online
MODFLOW Guide
<https://water.usgs.gov/ogw/modflow/MODFLOW-2005-Guide/swt.html>`_.

"""

import numpy as np

from ..pakbase import Package
from ..utils import Util2d, Util3d, read1d


[docs]class ModflowSwt(Package): """ MODFLOW SUB-WT Package Class. Parameters ---------- model : model object The model object (of type :class:`flopy.modflow.mf.Modflow`) to which this package will be added. ipakcb : int, optional Toggles whether cell-by-cell budget data should be saved. If None or zero, budget data will not be saved (default is None). iswtoc : int iswtoc is a flag used to control output of information generated by the SUB Package. (default is 0). nystm : int nsystm is the number of systems of interbeds. (default is 1). ithk : int ithk is a flag to determine how thicknesses of compressible sediments vary in response to changes in saturated thickness. If ithk < 1, thickness of compressible sediments is constant. If ithk > 0, thickness of compressible sediments varies in response to changes in saturated thickness. (default is 1). ivoid : int ivoid is a flag to determine how void ratios of compressible sediments vary in response to changes in saturated thickness. If ivoid < 1, void ratio will be treated as a constant. If ivoid > 0, void ratio will be treated as a variable. (default is 0). nn : int nn is the number of nodes used to discretize the half space to approximate the head distributions in systems of delay interbeds. (default is 20). istpcs : int istpcs is a flag to determine how initial preconsolidation stress will be obtained. If istpcs does not equal 0, an array of offset values will be read in for each model layer. The offset values will be added to the initial effective stress to get initial preconsolidation stress. If istpcs = 0, an array with initial preconsolidation stress values will be read. (default is 1). icrcc : int icrcc is a flag to determine how recompression and compression indices will be obtained. If ICRCC is not equal to 0, arrays of elastic specific storage and inelastic skeletal specific storage will be read for each system of interbeds; the recompression index and compression index will not be read. If icrcc = 0, arrays of recompression index and compression index will be read for each system of interbeds; elastic skeletal specific storage and inelastic skeletal specific storage will not be read. (default is 0). lnwt : int or array of ints (nsystm) lnwt is a one-dimensional array specifying the model layer assignments for each system of interbeds. (default is 0). izcfl : int izcfl is a flag to specify whether or not initial calculated values of layer-center elevation will be printed. (default is 0). izcfm : int izcfm is is a code for the format in which layer-center elevation will be printed. (default is 0). iglfl : int iglfl is a flag to specify whether or not initial calculated values of geostatic stress will be printed. (default is 0). iglfm : int iglfm is a code for the format in which geostatic stress will be printed. (default is 0). iestfl : int iestfl is a flag to specify whether or not initial calculated values of effective stress will be printed. (default is 0). iestfm : int iestfm is a code for the format in which effective stress will be printed. (default is 0). ipcsfl : int ipcsfl is a flag to specify whether or not initial calculated values of preconsolidation stress will be printed. (default is 0). ipcsfm : int ipcsfm is a code for the format in which preconsolidation stress will be printed. (default is 0). istfl : int istfl is a flag to specify whether or not initial equivalent storage properties will be printed for each system of interbeds. If icrcc is not equal to 0, the equivalent storage properties that can be printed are recompression and compression indices (cr and cc), which are calculated from elastic and inelastic skeletal specific storage (sske and sskv). If icrcc = 0, equivalent storage properties that can be printed are elastic and inelastic skeletal specific storage, which are calculated from the recompression and compression indices. (default is 0). istfm : int istfm is a code for the format in which equivalent storage properties will be printed. (default is 0). gl0 : float or array of floats (nrow, ncol) gl0 is an array specifying the geostatic stress above model layer 1. If the top of model layer 1 is the land surface, enter values of zero for this array. (default is 0.). sgm : float or array of floats (nrow, ncol) sgm is an array specifying the specific gravity of moist or unsaturated sediments. (default is 1.7). sgs : float or array of floats (nrow, ncol) sgs is an array specifying the specific gravity of saturated sediments. (default is 2.). thick : float or array of floats (nsystm, nrow, ncol) thick is an array specifying the thickness of compressible sediments. (default is 1.). sse : float or array of floats (nsystm, nrow, ncol) sse is an array specifying the initial elastic skeletal specific storage of compressible beds. sse is not used if icrcc = 0. (default is 1.). ssv : float or array of floats (nsystm, nrow, ncol) ssv is an array specifying the initial inelastic skeletal specific storage of compressible beds. ssv is not used if icrcc = 0. (default is 1.). cr : float or array of floats (nsystm, nrow, ncol) cr is an array specifying the recompression index of compressible beds. cr is not used if icrcc is not equal to 0. (default is 0.01). cc : float or array of floats (nsystm, nrow, ncol) cc is an array specifying the compression index of compressible beds cc is not used if icrcc is not equal to 0. (default is 0.25). void : float or array of floats (nsystm, nrow, ncol) void is an array specifying the initial void ratio of compressible beds. (default is 0.82). sub : float or array of floats (nsystm, nrow, ncol) sub is an array specifying the initial compaction in each system of interbeds. Compaction values computed by the package are added to values in this array so that printed or stored values of compaction and land subsidence may include previous components. Values in this array do not affect calculations of storage changes or resulting compaction. For simulations in which output values will reflect compaction and subsidence since the start of the simulation, enter zero values for all elements of this array. (default is 0.). pcsoff : float or array of floats (nlay, nrow, ncol) pcsoff is an array specifying the offset from initial effective stress to initial preconsolidation stress at the bottom of the model layer in units of height of a column of water. pcsoff is not used if istpcs=0. (default is 0.). pcs : float or array of floats (nlay, nrow, ncol) pcs is an array specifying the initial preconsolidation stress, in units of height of a column of water, at the bottom of the model layer. pcs is not used if istpcs is not equal to 0. (default is 0.). ids16 : list or array of ints (26) Format codes and unit numbers for swtsidence, compaction by model layer, compaction by interbed system, vertical displacement, preconsolidation stress, change in preconsolidation stress, geostatic stress, change in geostatic stress, effective stress, void ration, thickness of compressible sediments, and layer-center elevation will be printed. If ids16 is None and iswtoc>0 then print code 0 will be used for all data which is output to the binary swtsidence output file (unit=1054). The 26 entries in ids16 correspond to ifm1, iun1, ifm2, iun2, ifm3, iun3, ifm4, iun4, ifm5, iun5, ifm6, iun6, ifm7, iun7, ifm8, iun8, ifm9, iun9, ifm10, iun11, ifm12, iun12, ifm13, and iun13 variables. (default is None). ids17 : list or array of ints (iswtoc, 30) Stress period and time step range and print and save flags used to control printing and saving of information generated by the SUB-WT Package during program execution. Each row of ids17 corresponds to isp1, isp2, its1, its2, ifl1, ifl2, ifl3, ifl4, ifl5, ifl6, ifl7, ifl8, ifl9, ifl10, ifl11, ifl12, ifl13, ifl14, ifl15, ifl16, ifl17, ifl18, ifl9, ifl20, ifl21, ifl22, ifl23, ifl24, ifl25, and ifl26 variables for iswtoc entries. isp1, isp2, its1, and its2 are stress period and time step ranges. ifl1 and ifl2 control subsidence printing and saving. ifl3 and ifl4 control compaction by model layer printing and saving. ifl5 and ifl6 control compaction by interbed system printing and saving. ifl7 and ifl8 control vertical displacement printing and saving. ifl9 and ifl10 control preconsolidation stress printing and saving. ifl11 and ifl12 control change in preconsolidation stress printing and saving. ifl13 and ifl14 control geostatic stress printing and saving. ifl15 and ifl16 control change in geostatic stress printing and saving. ifl17 and ifl18 control effective stress printing and saving. ifl19 and ifl20 control change in effective stress printing and saving. ifl21 and ifl22 control void ratio printing and saving. ifl23 and ifl24 control compressible bed thickness printing and saving. ifl25 and ifl26 control layer-center elevation printing and saving. If ids17 is None and iswtoc>0 then all available subsidence output will be printed and saved to the binary subsidence output file (unit=1054). (default is None). 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 cbc output name and other swt output files will be created using the model name and .cbc and swt output extensions (for example, modflowtest.cbc), if ipakcb and other swt output files (dataset 16) are numbers greater than zero. If a single string is passed the package name will be set to the string and other swt output files will be set to the model name with the appropriate output file extensions. To define the names for all package files (input and output) the length of the list of strings should be 15. Default is None. Attributes ---------- Methods ------- See Also -------- Notes ----- Parameters are supported in Flopy only when reading in existing models. Parameter values are converted to native values in Flopy and the connection to "parameters" is thus nonexistent. Parameters are not supported in the SUB-WT Package. Examples -------- >>> import flopy >>> m = flopy.modflow.Modflow() >>> swt = flopy.modflow.ModflowSwt(m) """
[docs] def write_file(self, f=None): """ Write the package file. Returns ------- None """ nrow, ncol, nlay, nper = self.parent.nrow_ncol_nlay_nper # Open file for writing if f is None: f = open(self.fn_path, "w") # First line: heading f.write(f"{self.heading}\n") # write dataset 1 f.write( "{} {} {} {} {} {} {}\n".format( self.ipakcb, self.iswtoc, self.nsystm, self.ithk, self.ivoid, self.istpcs, self.icrcc, ) ) # write dataset 2 t = self.lnwt.array for tt in t: f.write(f"{tt + 1} ") f.write("\n") # write dataset 3 f.write( "{} {} {} {} {} {} {} {} {} {}\n".format( self.izcfl, self.izcfm, self.iglfl, self.iglfm, self.iestfl, self.iestfm, self.ipcsfl, self.ipcsfm, self.istfl, self.istfm, ) ) # write dataset 4 f.write(self.gl0.get_file_entry()) # write dataset 5 f.write(self.sgm.get_file_entry()) # write dataset 6 f.write(self.sgs.get_file_entry()) # write datasets 7 to 13 for k in range(self.nsystm): f.write(self.thick[k].get_file_entry()) if self.icrcc != 0: f.write(self.sse[k].get_file_entry()) f.write(self.ssv[k].get_file_entry()) else: f.write(self.cr[k].get_file_entry()) f.write(self.cc[k].get_file_entry()) f.write(self.void[k].get_file_entry()) f.write(self.sub[k].get_file_entry()) # write datasets 14 and 15 for k in range(nlay): if self.istpcs != 0: f.write(self.pcsoff[k].get_file_entry()) else: f.write(self.pcs[k].get_file_entry()) # write dataset 16 and 17 if self.iswtoc > 0: # dataset 16 for i in self.ids16: f.write(f"{i} ") f.write(" #dataset 16\n") # dataset 17 for k in range(self.iswtoc): t = self.ids17[k, :].copy() t[0:4] += 1 for i in t: f.write(f"{i} ") f.write(f" #dataset 17 iswtoc {k + 1}\n") # close swt file f.close()
def __init__( self, model, ipakcb=None, iswtoc=0, nsystm=1, ithk=0, ivoid=0, istpcs=1, icrcc=0, lnwt=0, izcfl=0, izcfm=0, iglfl=0, iglfm=0, iestfl=0, iestfm=0, ipcsfl=0, ipcsfm=0, istfl=0, istfm=0, gl0=0.0, sgm=1.7, sgs=2.0, thick=1.0, sse=1.0, ssv=1.0, cr=0.01, cc=0.25, void=0.82, sub=0.0, pcsoff=0.0, pcs=0.0, ids16=None, ids17=None, extension="swt", unitnumber=None, filenames=None, ): # set default unit number of one is not specified if unitnumber is None: unitnumber = ModflowSwt._defaultunit() # set filenames filenames = self._prepare_filenames(filenames, 15) # cbc output file self.set_cbc_output_file(ipakcb, model, filenames[1]) item16_extensions = [ "swt_subsidence.hds", "swt_total_comp.hds", "swt_inter_comp.hds", "swt_vert_disp.hds", "swt_precon_stress.hds", "swt_precon_stress_delta.hds", "swt_geostatic_stress.hds", "swt_geostatic_stress_delta.hds", "swt_eff_stress.hds", "swt_eff_stress_delta.hds", "swt_void_ratio.hds", "swt_thick.hds", "swt_lay_center.hds", ] item16_units = [2052 + i for i in range(len(item16_extensions))] if iswtoc > 0: for idx, k in enumerate(range(1, 26, 2)): if ids16 is None: iu = item16_units[idx] else: iu = ids16[k] model.add_output_file( iu, fname=filenames[idx + 2], extension=item16_extensions[idx], package=self._ftype(), ) # call base package constructor super().__init__( model, extension=extension, name=self._ftype(), unit_number=unitnumber, filenames=filenames[0], ) nrow, ncol, nlay, nper = self.parent.nrow_ncol_nlay_nper self._generate_heading() self.url = "swt.html" self.iswtoc = iswtoc self.nsystm = nsystm self.ithk = ithk self.ivoid = ivoid self.istpcs = istpcs self.icrcc = icrcc self.lnwt = Util2d(model, (nsystm,), np.int32, lnwt, name="lnwt") self.izcfl = izcfl self.izcfm = izcfm self.iglfl = iglfl self.iglfm = iglfm self.iestfl = iestfl self.iestfm = iestfm self.ipcsfl = ipcsfl self.ipcsfm = ipcsfm self.istfl = istfl self.istfm = istfm self.gl0 = Util2d(model, (nrow, ncol), np.float32, gl0, name="gl0") self.sgm = Util2d(model, (nrow, ncol), np.float32, sgm, name="sgm") self.sgs = Util2d(model, (nrow, ncol), np.float32, sgs, name="sgs") # interbed data self.thick = Util3d( model, (nsystm, nrow, ncol), np.float32, thick, name=["thick system " for n in range(nsystm)], locat=self.unit_number[0], ) self.void = Util3d( model, (nsystm, nrow, ncol), np.float32, void, name=["void system " for n in range(nsystm)], locat=self.unit_number[0], ) self.sub = Util3d( model, (nsystm, nrow, ncol), np.float32, sub, name=["sub system " for n in range(nsystm)], locat=self.unit_number[0], ) if icrcc != 0: self.sse = Util3d( model, (nsystm, nrow, ncol), np.float32, sse, name=["sse system " for n in range(nsystm)], locat=self.unit_number[0], ) self.ssv = Util3d( model, (nsystm, nrow, ncol), np.float32, ssv, name=["ssc system " for n in range(nsystm)], locat=self.unit_number[0], ) self.cr = None self.cc = None else: self.sse = None self.ssv = None self.cr = Util3d( model, (nsystm, nrow, ncol), np.float32, cr, name=["cr system " for n in range(nsystm)], locat=self.unit_number[0], ) self.cc = Util3d( model, (nsystm, nrow, ncol), np.float32, cc, name=["cc system " for n in range(nsystm)], locat=self.unit_number[0], ) # layer data if istpcs != 0: self.pcsoff = Util3d( model, (nlay, nrow, ncol), np.float32, pcsoff, name="pcsoff", locat=self.unit_number[0], ) self.pcs = None else: self.pcsoff = None self.pcs = Util3d( model, (nlay, nrow, ncol), np.float32, pcs, name="pcs", locat=self.unit_number[0], ) # output data if iswtoc > 0: if ids16 is None: self.ids16 = np.zeros((26), dtype=np.int32) ui = 0 for i in range(1, 26, 2): self.ids16[i] = item16_units[ui] ui += 1 else: if isinstance(ids16, list): ds16 = np.array(ids16) assert len(ids16) == 26 self.ids16 = ids16 if ids17 is None: ids17 = np.ones((30), dtype=np.int32) ids17[0] = 0 ids17[2] = 0 ids17[1] = 9999 ids17[3] = 9999 self.ids17 = np.atleast_2d(ids17) else: if isinstance(ids17, list): ids17 = np.atleast_2d(np.array(ids17)) assert ids17.shape[1] == 30 self.ids17 = ids17 # add package to model self.parent.add_package(self)
[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 ------- swt : ModflowSwt object Examples -------- >>> import flopy >>> m = flopy.modflow.Modflow() >>> swt = flopy.modflow.ModflowSwt.load('test.swt', m) """ if model.verbose: print("loading swt package file...") openfile = not hasattr(f, "read") if openfile: filename = f f = open(filename, "r") # dataset 0 -- header while True: line = f.readline() if line[0] != "#": break # determine problem dimensions nrow, ncol, nlay, nper = model.get_nrow_ncol_nlay_nper() # read dataset 1 if model.verbose: print(" loading swt dataset 1") t = line.strip().split() ipakcb, iswtoc, nsystm, ithk, ivoid, istpcs, icrcc = ( int(t[0]), int(t[1]), int(t[2]), int(t[3]), int(t[4]), int(t[5]), int(t[6]), ) # read dataset 2 lnwt = None if nsystm > 0: if model.verbose: print(" loading swt dataset 2") lnwt = np.empty((nsystm), dtype=np.int32) lnwt = read1d(f, lnwt) - 1 # read dataset 3 if model.verbose: print(" loading swt dataset 3") line = f.readline() t = line.strip().split() ( iizcfl, izcfm, iglfl, iglfm, iestfl, iestfm, ipcsfl, ipcsfm, istfl, istfm, ) = ( int(t[0]), int(t[1]), int(t[2]), int(t[3]), int(t[4]), int(t[5]), int(t[6]), int(t[7]), int(t[8]), int(t[9]), ) # read dataset 4 if model.verbose: print(" loading swt dataset 4") gl0 = Util2d.load( f, model, (nrow, ncol), np.float32, "gl0", ext_unit_dict ) # read dataset 5 if model.verbose: print(" loading swt dataset 5") sgm = Util2d.load( f, model, (nrow, ncol), np.float32, "sgm", ext_unit_dict ) # read dataset 6 if model.verbose: print(" loading swt dataset 6") sgs = Util2d.load( f, model, (nrow, ncol), np.float32, "sgs", ext_unit_dict ) # read datasets 7 to 13 thick = [0] * nsystm void = [0] * nsystm sub = [0] * nsystm if icrcc == 0: sse = None ssv = None cr = [0] * nsystm cc = [0] * nsystm else: sse = [0] * nsystm ssv = [0] * nsystm cr = None cc = None for k in range(nsystm): kk = lnwt[k] + 1 # thick if model.verbose: print(f" loading swt dataset 7 for layer {kk}") t = Util2d.load( f, model, (nrow, ncol), np.float32, f"thick layer {kk}", ext_unit_dict, ) thick[k] = t if icrcc != 0: # sse if model.verbose: print(f" loading swt dataset 8 for layer {kk}") t = Util2d.load( f, model, (nrow, ncol), np.float32, f"sse layer {kk}", ext_unit_dict, ) sse[k] = t # ssv if model.verbose: print(f" loading swt dataset 9 for layer {kk}") t = Util2d.load( f, model, (nrow, ncol), np.float32, f"sse layer {kk}", ext_unit_dict, ) ssv[k] = t else: # cr if model.verbose: print(f" loading swt dataset 10 for layer {kk}") t = Util2d.load( f, model, (nrow, ncol), np.float32, f"cr layer {kk}", ext_unit_dict, ) cr[k] = t # cc if model.verbose: print(f" loading swt dataset 11 for layer {kk}") t = Util2d.load( f, model, (nrow, ncol), np.float32, f"cc layer {kk}", ext_unit_dict, ) cc[k] = t # void if model.verbose: print(f" loading swt dataset 12 for layer {kk}") t = Util2d.load( f, model, (nrow, ncol), np.float32, f"void layer {kk}", ext_unit_dict, ) void[k] = t # sub if model.verbose: print(f" loading swt dataset 13 for layer {kk}") t = Util2d.load( f, model, (nrow, ncol), np.float32, f"sub layer {kk}", ext_unit_dict, ) sub[k] = t # dataset 14 and 15 if istpcs != 0: pcsoff = [0] * nlay pcs = None else: pcsoff = None pcs = [0] * nlay for k in range(nlay): if istpcs != 0: if model.verbose: print(f" loading swt dataset 14 for layer {kk}") t = Util2d.load( f, model, (nrow, ncol), np.float32, f"pcsoff layer {k + 1}", ext_unit_dict, ) pcsoff[k] = t else: if model.verbose: print(f" loading swt dataset 15 for layer {kk}") t = Util2d.load( f, model, (nrow, ncol), np.float32, f"pcs layer {k + 1}", ext_unit_dict, ) pcs[k] = t ids16 = None ids17 = None if iswtoc > 0: # dataset 16 if model.verbose: print(f" loading swt dataset 15 for layer {kk}") ids16 = np.empty(26, dtype=np.int32) ids16 = read1d(f, ids16) # for k in range(1, 26, 2): # model.add_pop_key_list(ids16[k]) # ids16[k] = 2054 # all sub-wt data sent to unit 2054 # dataset 17 ids17 = [0] * iswtoc for k in range(iswtoc): if model.verbose: print(f" loading swt dataset 17 for iswtoc {k + 1}") t = np.empty(30, dtype=np.int32) t = read1d(f, t) t[0:4] -= 1 ids17[k] = t if openfile: f.close() # determine specified unit number unitnumber = None filenames = [None for x in range(15)] if ext_unit_dict is not None: unitnumber, filenames[0] = model.get_ext_dict_attr( ext_unit_dict, filetype=ModflowSwt._ftype() ) if ipakcb > 0: iu, filenames[1] = model.get_ext_dict_attr( ext_unit_dict, unit=ipakcb ) if iswtoc > 0: ipos = 2 for k in range(1, 26, 2): unit = ids16[k] if unit > 0: iu, filenames[ipos] = model.get_ext_dict_attr( ext_unit_dict, unit=unit ) model.add_pop_key_list(unit) ipos += 1 # return sut-wt instance return cls( model, ipakcb=ipakcb, iswtoc=iswtoc, nsystm=nsystm, ithk=ithk, ivoid=ivoid, istpcs=istpcs, icrcc=icrcc, lnwt=lnwt, izcfl=iizcfl, izcfm=izcfm, iglfl=iglfl, iglfm=iglfm, iestfl=iestfl, iestfm=iestfm, ipcsfl=ipcsfl, ipcsfm=ipcsfm, istfl=istfl, istfm=istfm, gl0=gl0, sgm=sgm, sgs=sgs, thick=thick, sse=sse, ssv=ssv, cr=cr, cc=cc, void=void, sub=sub, pcsoff=pcsoff, pcs=pcs, ids16=ids16, ids17=ids17, unitnumber=unitnumber, filenames=filenames, )
@staticmethod def _ftype(): return "SWT" @staticmethod def _defaultunit(): return 35