def load(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 ------- swi2 : ModflowSwi2 object Examples -------- >>> import flopy >>> m = flopy.modflow.Modflow() >>> swi2 = flopy.modflow.ModflowSwi2.load('test.swi2', m) """ if model.verbose: sys.stdout.write('loading swi2 package file...\n') if not hasattr(f, 'read'): 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: sys.stdout.write(' loading swi2 dataset 1\n') t = line.strip().split() nsrf = int(t[0]) istrat = int(t[1]) nobs = int(t[2]) if int(t[3]) > 0: model.add_pop_key_list(int(t[3])) iswizt = 55 if int(t[4]) > 0: model.add_pop_key_list(int(t[4])) ipakcb = 56 else: ipakcb = 0 iswiobs = 0 if int(t[5]) > 0: model.add_pop_key_list(int(t[5])) iswiobs = 1051 options = [] adaptive = False for idx in range(6, len(t)): if '#' in t[idx]: break options.append(t[idx]) if 'adaptive' in t[idx].lower(): adaptive = True # read dataset 2a if model.verbose: sys.stdout.write(' loading swi2 dataset 2a\n') while True: line = f.readline() if line[0] != '#': break t = line.strip().split() nsolver = int(t[0]) iprsol = int(t[1]) mutsol = int(t[2]) # read dataset 2b solver2params = {} if nsolver == 2: if model.verbose: sys.stdout.write(' loading swi2 dataset 2b\n') while True: line = f.readline() if line[0] != '#': break t = line.strip().split() solver2params['mxiter'] = int(t[0]) solver2params['iter1'] = int(t[1]) solver2params['npcond'] = int(t[2]) solver2params['zclose'] = float(t[3]) solver2params['rclose'] = float(t[4]) solver2params['relax'] = float(t[5]) solver2params['nbpol'] = int(t[6]) solver2params['damp'] = float(t[7]) solver2params['dampt'] = float(t[8]) # read dataset 3a if model.verbose: sys.stdout.write(' loading swi2 dataset 3a\n') while True: line = f.readline() if line[0] != '#': break t = line.strip().split() toeslope = float(t[0]) tipslope = float(t[1]) alpha = None beta = 0.1 if len(t) > 2: try: alpha = float(t[2]) beta = float(t[3]) except: pass # read dataset 3b nadptmx, nadptmn, adptfct = None, None, None if adaptive: if model.verbose: sys.stdout.write(' loading swi2 dataset 3b\n') while True: line = f.readline() if line[0] != '#': break t = line.strip().split() nadptmx = int(t[0]) nadptmn = int(t[1]) adptfct = float(t[2]) # read dataset 4 if model.verbose: print(' loading nu...') if istrat == 1: nnu = nsrf + 1 else: nnu = nsrf + 2 while True: ipos = f.tell() line = f.readline() if line[0] != '#': f.seek(ipos) break nu = Util2d.load(f, model, (1, nnu), np.float32, 'nu', ext_unit_dict) nu = nu.array.reshape((nnu)) # read dataset 5 if model.verbose: print(' loading initial zeta surfaces...') while True: ipos = f.tell() line = f.readline() if line[0] != '#': f.seek(ipos) break zeta = [] for n in range(nsrf): ctxt = 'zeta_surf{:02d}'.format(n + 1) zeta.append(Util3d.load(f, model, (nlay, nrow, ncol), np.float32, ctxt, ext_unit_dict)) # read dataset 6 if model.verbose: print(' loading initial ssz...') while True: ipos = f.tell() line = f.readline() if line[0] != '#': f.seek(ipos) break ssz = Util3d.load(f, model, (nlay, nrow, ncol), np.float32, 'ssz', ext_unit_dict) # read dataset 7 if model.verbose: print(' loading initial isource...') while True: ipos = f.tell() line = f.readline() if line[0] != '#': f.seek(ipos) break isource = Util3d.load(f, model, (nlay, nrow, ncol), np.int, 'isource', ext_unit_dict) # read dataset 8 obsname = [] obslrc = [] if nobs > 0: if model.verbose: print(' loading observation locations...') while True: line = f.readline() if line[0] != '#': break for i in range(nobs): if i > 0: try: line = f.readline() except: break t = line.strip().split() obsname.append(t[0]) kk = int(t[1]) ii = int(t[2]) jj = int(t[3]) obslrc.append([kk, ii, jj]) nobs = len(obsname) # create swi2 instance swi2 = ModflowSwi2(model, nsrf=nsrf, istrat=istrat, nobs=nobs, iswizt=iswizt, ipakcb=ipakcb, iswiobs=iswiobs, options=options, nsolver=nsolver, iprsol=iprsol, mutsol=mutsol, solver2params=solver2params, toeslope=toeslope, tipslope=tipslope, alpha=alpha, beta=beta, nadptmx=nadptmx, nadptmn=nadptmn, adptfct=adptfct, nu=nu, zeta=zeta, ssz=ssz, isource=isource, obsnam=obsname, obslrc=obslrc) # return swi2 instance return swi2
def load(f, model, nlay=None, nrow=None, ncol=None, 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.mt3d.mt.Mt3dms`) to which this package will be added. nlay : int number of model layers. If None it will be retrieved from the model. nrow : int number of model rows. If None it will be retrieved from the model. ncol : int number of model columns. If None it will be retrieved from the model. 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 ------- adv : Mt3dDsp object Mt3dDsp object. Examples -------- >>> import flopy >>> mt = flopy.mt3d.Mt3dms() >>> dsp = flopy.mt3d.Mt3dAdv.load('test.dsp', m) """ if model.verbose: sys.stdout.write("loading dsp package file...\n") # Set dimensions if necessary if nlay is None: nlay = model.nlay if nrow is None: nrow = model.nrow if ncol is None: ncol = model.ncol # Open file, if necessary if not hasattr(f, "read"): filename = f f = open(filename, "r") # Dataset 0 -- comment line imsd = 0 while True: line = f.readline() if line.strip() == "": continue elif line[0] == "#": continue elif line[0] == "$": imsd = 1 break else: break # Check for keywords (multidiffusion) multiDiff = False if imsd == 1: keywords = line[1:].strip().split() for k in keywords: if k.lower() == "multidiffusion": multiDiff = True else: # go back to beginning of file f.seek(0, 0) # Read arrays if model.verbose: print(" loading AL...") al = Util3d.load(f, model, (nlay, nrow, ncol), np.float32, "al", ext_unit_dict) if model.verbose: print(" loading TRPT...") trpt = Util2d.load(f, model, (nlay, 1), np.float32, "trpt", ext_unit_dict) if model.verbose: print(" loading TRPV...") trpv = Util2d.load(f, model, (nlay, 1), np.float32, "trpv", ext_unit_dict) if model.verbose: print(" loading DMCOEFF...") kwargs = {} dmcoef = [] if multiDiff: dmcoef = Util3d.load(f, model, (nlay, nrow, ncol), np.float32, "dmcoef1", ext_unit_dict) if model.mcomp > 1: for icomp in range(2, model.mcomp + 1): name = "dmcoef" + str(icomp) u3d = Util3d.load(f, model, (nlay, nrow, ncol), np.float32, name, ext_unit_dict) kwargs[name] = u3d else: dmcoef = Util2d.load(f, model, (nlay, 1), np.float32, "dmcoef1", ext_unit_dict) if model.mcomp > 1: for icomp in range(2, model.mcomp + 1): name = "dmcoef" + str(icomp + 1) u2d = Util2d.load(f, model, (nlay, 1), np.float32, name, ext_unit_dict) kwargs[name] = u2d dsp = Mt3dDsp(model, al=al, trpt=trpt, trpv=trpv, dmcoef=dmcoef, multiDiff=multiDiff, **kwargs) return dsp
def load(f, model, nlay=None, nrow=None, ncol=None, 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. nlay, nrow, ncol : int, optional If not provided, then the model must contain a discretization package with correct values for these parameters. 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 ------- bas : ModflowBas object ModflowBas object (of type :class:`flopy.modflow.ModflowBas`) Examples -------- >>> import flopy >>> m = flopy.modflow.Modflow() >>> bas = flopy.modflow.ModflowBas.load('test.bas', m, nlay=1, nrow=10, >>> ncol=10) """ if model.verbose: sys.stdout.write('loading bas6 package file...\n') if not hasattr(f, 'read'): filename = f f = open(filename, 'r') #dataset 0 -- header while True: line = f.readline() if line[0] != '#': break #dataset 1 -- options line = line.upper() opts = line.strip().split() ixsec = False ichflg = False ifrefm = False iprinttime = False ishowp = False istoperror = False stoper = None if 'XSECTION' in opts: ixsec = True if 'CHTOCH' in opts: ichflg = True if 'FREE' in opts: ifrefm = True if 'PRINTTIME' in opts: iprinttime = True if 'SHOWPROGRESS' in opts: ishowp = True if 'STOPERROR' in opts: istoperror = True i = opts.index('STOPERROR') stoper = np.float32(opts[i+1]) #get nlay,nrow,ncol if not passed if nlay is None and nrow is None and ncol is None: nrow, ncol, nlay, nper = model.get_nrow_ncol_nlay_nper() #dataset 2 -- ibound ibound = Util3d.load(f, model, (nlay, nrow, ncol), np.int, 'ibound', ext_unit_dict) #print ibound.array #dataset 3 -- hnoflo line = f.readline() hnoflo = np.float32(line.strip().split()[0]) #dataset 4 -- strt strt = Util3d.load(f, model, (nlay, nrow, ncol), np.float32, 'strt', ext_unit_dict) f.close() #create bas object and return bas = ModflowBas(model, ibound=ibound, strt=strt, ixsec=ixsec, ifrefm=ifrefm, ichflg=ichflg, stoper=stoper, hnoflo=hnoflo) return bas
def load(f, model, nlay=None, nrow=None, ncol=None, nper=None, ncomp=None, 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.mt3d.mt.Mt3dms`) 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 ------- uzt : Mt3dSsm object Mt3dUzt object. Examples -------- >>> import flopy >>> mt = flopy.mt3d.Mt3dms() >>> uzt = flopy.mt3d.Mt3dUzt.load('test.uzt', mt) """ if model.verbose: print('loading uzt package file...\n') # Open file if necessary if not hasattr(f, 'read'): filename = f f = open(filename, 'r') # Set dimensions if necessary if nlay is None: nlay = model.nlay if nrow is None: nrow = model.nrow if ncol is None: ncol = model.ncol if nper is None: nper = model.nper if ncomp is None: ncomp = model.ncomp # Item 1 (comments, must be preceded by '#') if model.verbose: print(' Reading off comment lines...') line = f.readline() while line[0:1] == '#': i = 1 if model.verbose: print(' Comment Line ' + str(i) + ': '.format(line.strip())) i += 1 line = f.readline() # Item 2 (MXUZCON, ICBCUZ, IET) if line[0:1] != '#': # Don't yet read the next line because the current line because it # contains the values in item 2 m_arr = line.strip().split() mxuzcon = int(m_arr[0]) icbcuz = int(m_arr[1]) iet = int(m_arr[2]) # Item 3 [IUZFBND(NROW,NCOL) (one array for each layer)] if model.verbose: print(' loading IUZFBND...') iuzfbnd = Util2d.load(f, model, (nrow, ncol), np.int, 'iuzfbnd', ext_unit_dict) # Item 4 [WC(NROW,NCOL) (one array for each layer)] if model.verbose: print(' loading WC...') wc = Util3d.load(f, model, (nlay, nrow, ncol), np.float32, 'wc', ext_unit_dict) # Item 5 [SDH(NROW,NCOL) (one array for each layer)] if model.verbose: print(' loading SDH...') sdh = Util3d.load(f, model, (nlay, nrow, ncol), np.float32, 'sdh', ext_unit_dict) # kwargs needed to construct cuzinf2, cuzinf3, etc. for multispecies kwargs = {} cuzinf = None # At least one species being simulated, so set up a place holder t2d = Transient2d(model, (nrow, ncol), np.float32, 0.0, name='cuzinf', locat=0) cuzinf = {0 : t2d} if ncomp > 1: for icomp in range(2, ncomp + 1): name = 'cuzinf' + str(icomp) t2d = Transient2d(model, (nrow, ncol), np.float32, 0.0, name=name, locat=0) kwargs[name] = {0 : t2d} # Repeat cuzinf initialization procedure for cuzet only if iet != 0 if iet != 0: cuzet = None t2d = Transient2d(model, (nrow, ncol), np.float32, 0.0, name='cuzet', locat=0) cuzet = {0 : t2d} if ncomp > 1: for icomp in range(2, ncomp + 1): name = 'cuzet' + str(icomp) t2d = Transient2d(model, (nrow, ncol), np.float32, 0.0, name=name, locat=0) kwargs[name] = {0 : t2d} # Repeat cuzinf initialization procedures for cgwet cgwet = None t2d = Transient2d(model, (nrow, ncol), np.float32, 0.0, name='cgwet', locat=0) cgwet = {0 : t2d} if ncomp > 1: for icomp in range(2, ncomp + 1): name = 'cgwet' + str(icomp) t2d = Transient2d(model, (nrow, ncol), np.float32, 0.0, name=name, locat=0) kwargs[name] = {0 : t2d} elif iet == 0: cuzet = None cgwet = None # Start of transient data for iper in range(nper): if model.verbose: print(' loading UZT data for kper {0:5d}'.format(iper + 1)) # Item 6 (INCUZINF) line = f.readline() m_arr = line.strip().split() incuzinf = int(m_arr[0]) # Item 7 (CUZINF) if incuzinf >= 0: if model.verbose: print(' Reading CUZINF array for kper ' \ '{0:5d}'.format(iper + 1)) t = Util2d.load(f, model, (nrow, ncol), np.float32, 'cuzinf', ext_unit_dict) cuzinf[iper] = t # Load each multispecies array if ncomp > 1: for icomp in range(2, ncomp + 1): name = 'cuzinf' + str(icomp) if model.verbose: print(' loading {}...'.format(name)) t = Util2d.load(f, model, (nrow, ncol), np.float32, name, ext_unit_dict) cuzinficomp = kwargs[name] cuzinficomp[iper] = t elif incuzinf < 0 and iper == 0: if model.verbose: print(' INCUZINF < 0 in first stress period. Setting ' \ 'CUZINF to default value of 0.00 for all calls') # This happens implicitly and is taken care of my # existing functionality within flopy. This elif # statement exist for the purpose of printing the message # above pass elif incuzinf < 0 and iper > 0: if model.verbose: print(' Reusing CUZINF array from kper ' \ '{0:5d}'.format(iper) + ' in kper ' \ '{0:5d}'.format(iper + 1)) if iet != 0: # Item 8 (INCUZET) line = f.readline() m_arr = line.strip().split() incuzet = int(m_arr[0]) # Item 9 (CUZET) if incuzet >= 0: if model.verbose: print(' Reading CUZET array for kper ' \ '{0:5d}'.format(iper + 1)) t = Util2d.load(f, model, (nrow, ncol), np.float32, 'cuzet', ext_unit_dict) cuzet[iper] = t # Load each multispecies array if ncomp > 1: for icomp in range(2, ncomp + 1): name = 'cuzet' + str(icomp) if model.verbose: print(' loading {}'.format(name)) t = Util2d.load(f, model, (nrow, ncol), np.float32, name, ext_unit_dict) cuzeticomp = kwargs[name] cuzeticomp[iper] = t elif incuzet < 0 and iper == 0: if model.verbose: print(' INCUZET < 0 in first stress period. Setting ' \ 'CUZET to default value of 0.00 for all calls') # This happens implicitly and is taken care of my # existing functionality within flopy. This elif # statement exist for the purpose of printing the message # above pass else: if model.verbose: print(' Reusing CUZET array from kper ' \ '{0:5d}'.format(iper) + ' in kper ' \ '{0:5d}'.format(iper + 1)) # Item 10 (INCGWET) line = f.readline() m_arr = line.strip().split() incgwet = int(m_arr[0]) # Item 11 (CGWET) if model.verbose: if incuzet >= 0: print(' Reading CGWET array for kper ' \ '{0:5d}'.format(iper + 1)) t = Util2d.load(f, model, (nrow,ncol), np.float32, 'cgwet', ext_unit_dict) cgwet[iper] = t # Load each multispecies array if ncomp > 1: for icomp in range(2, ncomp + 1): name = 'cgwet' + str(icomp) if model.verbose: print(' loading {}...'.format(name)) t = Util2d.load(f, model, (nrow, ncol), np.float32, name, ext_unit_dict) cgweticomp = kwargs[name] cgweticomp[iper] = t elif incuzet < 0 and iper == 0: if model.verbose: print(' INCGWET < 0 in first stress period. Setting ' \ 'CGWET to default value of 0.00 for all calls') # This happens implicitly and is taken care of my # existing functionality within flopy. This elif # statement exist for the purpose of printing the # message above pass elif incgwet < 0 and iper > 0: if model.verbose: print(' Reusing CGWET array from kper ' \ '{0:5d}'.format(iper) + ' in kper ' \ '{0:5d}'.format(iper + 1)) # Construct and return uzt package uzt = Mt3dUzt(model, mxuzcon=mxuzcon, icbcuz=icbcuz, iet=iet, iuzfbnd=iuzfbnd, wc=wc, sdh=sdh, cuzinf=cuzinf, cuzet=cuzet, cgwet=cgwet, **kwargs) return uzt
def load(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 ------- dis : ModflowDis object ModflowDis object. Examples -------- >>> import flopy >>> m = flopy.modflow.Modflow() >>> dis = flopy.modflow.ModflowDis.load('test.dis', m) """ if model.verbose: sys.stdout.write('loading dis package file...\n') if not hasattr(f, 'read'): filename = f f = open(filename, 'r') # dataset 0 -- header while True: line = f.readline() if line[0] != '#': break # dataset 1 nlay, nrow, ncol, nper, itmuni, lenuni = line.strip().split()[0:6] nlay = int(nlay) nrow = int(nrow) ncol = int(ncol) nper = int(nper) itmuni = int(itmuni) lenuni = int(lenuni) # dataset 2 -- laycbd if model.verbose: print(' Loading dis package with:\n ' + \ '{0} layers, {1} rows, {2} columns, and {3} stress periods'.format(nlay, nrow, ncol, nper)) print(' loading laycbd...') laycbd = np.empty((nlay), dtype=np.int) d = 0 while True: line = f.readline() raw = line.strip('\n').split() for val in raw: laycbd[d] = np.int(val) d += 1 if d == nlay: break if d == nlay: break # dataset 3 -- delr if model.verbose: print(' loading delr...') delr = Util2d.load(f, model, (1, ncol), np.float32, 'delr', ext_unit_dict) delr = delr.array.reshape((ncol)) #dataset 4 -- delc if model.verbose: print(' loading delc...') delc = Util2d.load(f, model, (1, nrow), np.float32, 'delc', ext_unit_dict) delc = delc.array.reshape((nrow)) #dataset 5 -- top if model.verbose: print(' loading top...') top = Util2d.load(f, model, (nrow, ncol), np.float32, 'top', ext_unit_dict) #dataset 6 -- botm if model.verbose: print(' loading botm...') ncbd = laycbd.sum() if nlay > 1: botm = Util3d.load(f, model, (nlay + ncbd, nrow, ncol), np.float32, 'botm', ext_unit_dict) else: botm = Util3d.load(f, model, (nlay, nrow, ncol), np.float32, 'botm', ext_unit_dict) #dataset 7 -- stress period info if model.verbose: print(' loading stress period data...') perlen = [] nstp = [] tsmult = [] steady = [] for k in range(nper): line = f.readline() a1, a2, a3, a4 = line.strip().split()[0:4] a1 = float(a1) a2 = int(a2) a3 = float(a3) if a4.upper() == 'TR': a4 = False else: a4 = True perlen.append(a1) nstp.append(a2) tsmult.append(a3) steady.append(a4) # create dis object instance dis = ModflowDis(model, nlay, nrow, ncol, nper, delr, delc, laycbd, top, botm, perlen, nstp, tsmult, steady, itmuni, lenuni) # return dis object instance return dis
def load(f, model, ext_unit_dict=None): if not hasattr(f, 'read'): filename = f f = open(filename, 'r') # A1 if model.verbose: print(' loading COMMENT LINES A1 AND A2...') line = f.readline() if model.verbose: print('A1: '.format(line.strip())) # A2 line = f.readline() if model.verbose: print('A2: '.format(line.strip())) # A3 if model.verbose: print(' loading NLAY, NROW, NCOL, NPER, NCOMP, MCOMP...') line = f.readline() nlay = int(line[0:10]) nrow = int(line[11:20]) ncol = int(line[21:30]) nper = int(line[31:40]) try: ncomp = int(line[41:50]) except: ncomp = 1 try: mcomp = int(line[51:60]) except: mcomp = 1 if model.verbose: print(' NLAY {}'.format(nlay)) print(' NROW {}'.format(nrow)) print(' NCOL {}'.format(ncol)) print(' NPER {}'.format(nper)) print(' NCOMP {}'.format(ncomp)) print(' MCOMP {}'.format(mcomp)) if model.verbose: print(' loading TUNIT, LUNIT, MUNIT...') line = f.readline() tunit = line[0:4] lunit = line[4:8] munit = line[8:12] if model.verbose: print(' TUNIT {}'.format(tunit)) print(' LUNIT {}'.format(lunit)) print(' MUNIT {}'.format(munit)) if model.verbose: print(' loading TRNOP...') trnop = f.readline()[:20].strip().split() if model.verbose: print(' TRNOP {}'.format(trnop)) if model.verbose: print(' loading LAYCON...') laycon = np.empty((nlay), np.int) laycon = read1d(f, laycon) if model.verbose: print(' LAYCON {}'.format(laycon)) if model.verbose: print(' loading DELR...') delr = Util2d.load(f, model, (ncol, 1), np.float32, 'delr', ext_unit_dict) if model.verbose: print(' DELR {}'.format(delr)) if model.verbose: print(' loading DELC...') delc = Util2d.load(f, model, (nrow, 1), np.float32, 'delc', ext_unit_dict) if model.verbose: print(' DELC {}'.format(delc)) if model.verbose: print(' loading HTOP...') htop = Util2d.load(f, model, (nrow, ncol), np.float32, 'htop', ext_unit_dict) if model.verbose: print(' HTOP {}'.format(htop)) if model.verbose: print(' loading DZ...') dz = Util3d.load(f, model, (nlay, nrow, ncol), np.float32, 'dz', ext_unit_dict) if model.verbose: print(' DZ {}'.format(dz)) if model.verbose: print(' loading PRSITY...') prsity = Util3d.load(f, model, (nlay, nrow, ncol), np.float32, 'prsity', ext_unit_dict) if model.verbose: print(' PRSITY {}'.format(prsity)) if model.verbose: print(' loading ICBUND...') icbund = Util3d.load(f, model, (nlay, nrow, ncol), np.int, 'icbund', ext_unit_dict) if model.verbose: print(' ICBUND {}'.format(icbund)) if model.verbose: print(' loading SCONC...') kwargs = {} sconc = Util3d.load(f, model, (nlay, nrow, ncol), np.float32, 'sconc1', ext_unit_dict) if ncomp > 1: for icomp in range(2, ncomp + 1): name = "sconc" + str(icomp) if model.verbose: print(' loading {}...'.format(name)) u3d = Util3d.load(f, model, (nlay, nrow, ncol), np.float32, name, ext_unit_dict) kwargs[name] = u3d if model.verbose: print(' SCONC {}'.format(sconc)) if model.verbose: print(' loading CINACT, THCKMIN...') line = f.readline() cinact = float(line[0:10]) try: thkmin = float(line[10:20]) except: thkmin = 0.01 if model.verbose: print(' CINACT {}'.format(cinact)) print(' THKMIN {}'.format(thkmin)) if model.verbose: print(' loading IFMTCN, IFMTNP, IFMTRF, IFMTDP, SAVUCN...') line = f.readline() ifmtcn = int(line[0:10]) ifmtnp = int(line[10:20]) ifmtrf = int(line[20:30]) ifmtdp = int(line[30:40]) savucn = False if 't' in line[40:50].lower(): savucn = True if model.verbose: print(' IFMTCN {}'.format(ifmtcn)) print(' IFMTNP {}'.format(ifmtnp)) print(' IFMTRF {}'.format(ifmtrf)) print(' IFMTDP {}'.format(ifmtdp)) print(' SAVUCN {}'.format(savucn)) if model.verbose: print(' loading NPRS...') line = f.readline() nprs = int(line[0:10]) if model.verbose: print(' NPRS {}'.format(nprs)) timprs = None if nprs > 0: if model.verbose: print(' loading TIMPRS...') timprs = np.empty((nprs), dtype=np.float32) read1d(f, timprs) if model.verbose: print(' TIMPRS {}'.format(timprs)) if model.verbose: print(' loading NOBS, NPROBS...') line = f.readline() nobs = int(line[0:10]) try: nprobs = int(line[10:20]) except: nprobs = 1 if model.verbose: print(' NOBS {}'.format(nobs)) print(' NPROBS {}'.format(nprobs)) obs = None if nobs > 0: if model.verbose: print(' loading KOBS, IOBS, JOBS...') obs = [] for l in range(nobs): line = f.readline() k = int(line[0:10]) i = int(line[10:20]) j = int(line[20:30]) obs.append([k, i, j]) obs = np.array(obs) if model.verbose: print(' OBS {}'.format(obs)) if model.verbose: print(' loading CHKMAS, NPRMAS...') line = f.readline() chkmas = False if 't' in line[0:10].lower(): chkmas = True try: nprmas = int(line[10:20]) except: nprmas = 1 if model.verbose: print(' CHKMAS {}'.format(chkmas)) print(' NPRMAS {}'.format(nprmas)) if model.verbose: print(' loading PERLEN, NSTP, TSMULT, TSLNGH, DT0, MXSTRN, TTSMULT, TTSMAX...') dt0, mxstrn, ttsmult, ttsmax = [], [], [], [] perlen = [] nstp = [] tsmult = [] tslngh = [] ssflag = [] for kper in range(nper): line = f.readline() perlen.append(float(line[0:10])) nstp.append(int(line[10:20])) tsmult.append(float(line[20:30])) sf = ' ' ll = line[30:].strip().split() if len(ll) > 0: if 'sstate' in ll[0].lower(): sf = 'SState' ssflag.append(sf) if tsmult[-1] < 0: t = np.empty((nstp[-1]), dtype=np.float32) read1d(f, t) tslngh.append(t) raise Exception("tsmult <= 0 not supported") line = f.readline() dt0.append(float(line[0:10])) mxstrn.append(int(line[10:20])) ttsmult.append(float(line[20:30])) ttsmax.append(float(line[30:40])) if model.verbose: print(' PERLEN {}'.format(perlen)) print(' NSTP {}'.format(nstp)) print(' TSMULT {}'.format(tsmult)) print(' SSFLAG {}'.format(ssflag)) print(' TSLNGH {}'.format(tslngh)) print(' DT0 {}'.format(dt0)) print(' MXSTRN {}'.format(mxstrn)) print(' TTSMULT {}'.format(ttsmult)) print(' TTSMAX {}'.format(ttsmax)) # Close the file f.close() btn = Mt3dBtn(model, nlay=nlay, nrow=nrow, ncol=ncol, nper=nper, ncomp=ncomp, mcomp=mcomp, tunit=tunit, laycon=laycon, delr=delr, delc=delc, htop=htop, dz=dz, lunit=lunit, munit=munit, prsity=prsity, icbund=icbund, sconc=sconc, cinact=cinact, thkmin=thkmin, ifmtcn=ifmtcn, ifmtnp=ifmtnp, ifmtrf=ifmtrf, ifmtdp=ifmtdp, savucn=savucn, nprs=nprs, timprs=timprs, obs=obs, nprobs=nprobs, chkmas=chkmas, nprmas=nprmas, perlen=perlen, nstp=nstp, tsmult=tsmult, ssflag=ssflag, dt0=dt0, mxstrn=mxstrn, ttsmult=ttsmult, ttsmax=ttsmax, **kwargs) return btn
def __init__(self, model, iss=1, ibcfcb=90, laycon=(0, ), trpy=(1., ), delr=(1., ), delc=(1., ), sf1=1., tran=1., hy=1., bot=1., vcont=1., sf2=1., top=1.): unitnumber = [1, ibcfcb] filenames = [None, None] name = [Modflow88Bcf.ftype()] units = [unitnumber[0]] extra = [""] fname = [filenames[0]] extension = "bas" super(Modflow88Bcf, self).__init__(model, extension=extension, name=name, unit_number=units, extra=extra, filenames=fname) nrow, ncol, nlay, nper = model.nrow_ncol_nlay_nper self.iss = iss self.ibcfcb = ibcfcb self.laycon = Util2d(model, (nlay, ), np.int32, laycon, name='laycon', locat=self.unit_number[0]) self.trpy = Util2d(model, (nlay, ), np.float32, trpy, name='Anisotropy factor', locat=self.unit_number[0]) self.delr = Util2d(model, (ncol, ), np.float32, delr, name='delr', locat=self.unit_number[0]) self.delc = Util2d(model, (nrow, ), np.float32, delc, name='delc', locat=self.unit_number[0]) self.sf1 = Util3d(model, (nlay, nrow, ncol), np.float32, sf1, 'Primary Storage Coefficient', locat=self.unit_number[0]) self.tran = Util3d(model, (nlay, nrow, ncol), np.float32, tran, 'Transmissivity', locat=self.unit_number[0]) self.hy = Util3d(model, (nlay, nrow, ncol), np.float32, hy, 'Horizontal Hydraulic Conductivity', locat=self.unit_number[0]) self.bot = Util3d(model, (nlay, nrow, ncol), np.float32, bot, 'bot', locat=self.unit_number[0]) self.vcont = Util3d(model, (nlay - 1, nrow, ncol), np.float32, vcont, 'Vertical Conductance', locat=self.unit_number[0]) self.sf2 = Util3d(model, (nlay, nrow, ncol), np.float32, sf2, 'Secondary Storage Coefficient', locat=self.unit_number[0]) self.top = Util3d(model, (nlay, nrow, ncol), np.float32, top, 'top', locat=self.unit_number[0]) self.parent.add_package(self)