feat(ModflowSms): add support for simple, moderate, complex (#906)

* Close #774
develop
langevin-usgs 2020-06-09 11:49:29 -05:00 committed by GitHub
parent 3182f57479
commit f539d072e2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 63 additions and 10 deletions

View File

@ -2,6 +2,20 @@ import os
import flopy
import numpy as np
tpth = os.path.abspath(os.path.join('temp', 't016'))
if not os.path.isdir(tpth):
os.makedirs(tpth)
exe_name = 'mfusg'
v = flopy.which(exe_name)
run = True
if v is None:
run = False
def test_usg_disu_load():
pthusgtest = os.path.join('..', 'examples', 'data', 'mfusg_test',
@ -17,7 +31,7 @@ def test_usg_disu_load():
assert isinstance(disu, flopy.modflow.ModflowDisU)
# Change where model files are written
model_ws = os.path.join('temp', 't016')
model_ws = tpth
m.model_ws = model_ws
# Write the disu file
@ -37,6 +51,7 @@ def test_usg_disu_load():
return
def test_usg_sms_load():
pthusgtest = os.path.join('..', 'examples', 'data', 'mfusg_test',
@ -52,7 +67,7 @@ def test_usg_sms_load():
assert isinstance(sms, flopy.modflow.ModflowSms)
# Change where model files are written
model_ws = os.path.join('temp', 't016')
model_ws = tpth
m.model_ws = model_ws
# Write the sms file
@ -69,6 +84,39 @@ def test_usg_sms_load():
return
def test_usg_model():
mf = flopy.modflow.Modflow(version='mfusg', structured=True,
model_ws=tpth, modelname='simple',
exe_name=v)
dis = flopy.modflow.ModflowDis(mf, nlay=1, nrow=11, ncol=11)
bas = flopy.modflow.ModflowBas(mf)
lpf = flopy.modflow.ModflowLpf(mf)
wel = flopy.modflow.ModflowWel(mf, stress_period_data={0: [[0, 5, 5, -1.]]})
ghb = flopy.modflow.ModflowGhb(mf,
stress_period_data={
0: [[0, 0, 0, 1.0, 1000.],
[0, 9, 9, 0.0, 1000.], ]})
oc = flopy.modflow.ModflowOc(mf)
sms = flopy.modflow.ModflowSms(mf, options='complex')
# run with defaults
mf.write_input()
if run:
success, buff = mf.run_model()
assert success
# try different complexity options; all should run successfully
for complexity in ['simple', 'moderate', 'complex']:
print('testing MFUSG with sms complexity: ' + complexity)
sms = flopy.modflow.ModflowSms(mf, options=complexity)
sms.write_file()
if run:
success, buff = mf.run_model()
assert success
if __name__ == '__main__':
test_usg_disu_load()
test_usg_sms_load()
test_usg_model()

View File

@ -304,6 +304,8 @@ class ModflowSms(Package):
if options is None:
self.options = []
else:
if not isinstance(options, list):
options = [options]
self.options = options
self.parent.add_package(self)
return
@ -319,21 +321,25 @@ class ModflowSms(Package):
"""
f = open(self.fn_path, 'w')
f.write('{}\n'.format(self.heading))
nopt = len(self.options)
if nopt > 0:
f.write(' '.join(self.options) + '\n')
f.write('{0} {1} {2} {3} {4} {5} {6}\n'.format(
self.hclose, self.hiclose, self.mxiter, self.iter1,
self.iprsms, self.nonlinmeth, self.linmeth))
if self.nonlinmeth != 0:
if self.nonlinmeth != 0 and nopt == 0:
f.write('{0} {1} {2} {3} {4} {5} {6} {7}\n'.format(
self.theta, self.akappa, self.gamma, self.amomentum,
self.numtrack, self.btol, self.breduc, self.reslim))
if self.linmeth == 1:
if self.linmeth == 1 and nopt == 0:
f.write('{0} {1} {2} {3} {4} {5} {6} {7}\n'.format(
self.iacl, self.norder, self.level, self.north,
self.iredsys, self.rrctol, self.idroptol, self.epsrn))
if self.linmeth == 2:
if self.linmeth == 2 and nopt == 0:
f.write('{0} {1} {2} {3} {4} {5}\n'.format(
self.clin, self.ipc, self.iscl, self.iord,
self.rclosepcgu, self.relaxpcgu))
f.write('\n')
f.close()
@staticmethod
@ -390,13 +396,12 @@ class ModflowSms(Package):
break
# Record 1a
nopt = 0
opts = ['simple', 'moderate', 'complex']
options = []
for o in opts:
if o in line.lower():
options.append(o)
nopt += 1
firstentry = line.strip().split()[0]
if firstentry.lower() in opts:
options.append(firstentry)
nopt = len(options)
if nopt > 0:
line = f.readline()