diff --git a/autotest/t071_test_nwt_ag.py b/autotest/t071_test_nwt_ag.py new file mode 100644 index 000000000..befda6cf0 --- /dev/null +++ b/autotest/t071_test_nwt_ag.py @@ -0,0 +1,82 @@ +import os +import flopy +import platform +import shutil +import numpy as np + + +mpth = os.path.join('..', 'examples', 'data', 'ag_test') +opth = os.path.join('temp', 't071') +if not os.path.exists(opth): + os.makedirs(opth) + + +def test_empty_ag_package(): + ml = flopy.modflow.Modflow("agtest", version='mfnwt') + ag = flopy.modflow.ModflowAg(ml) + + if not isinstance(ag, flopy.pakbase.Package): + raise Exception + + +def test_load_write_agwater(): + agfile = "Agwater1.ag" + ml = flopy.modflow.Modflow("Agwater1", version='mfnwt') + ag1 = flopy.modflow.ModflowAg.load(os.path.join(mpth, agfile), + ml, nper=49, ext_unit_dict={}) + + loaded = False + for pak in ml.packagelist: + if isinstance(pak, flopy.modflow.ModflowAg): + loaded = True + break + + if not loaded: + raise AssertionError("ModflowAg package not loaded") + + ml.change_model_ws(opth) + ag1.write_file() + + ml2 = flopy.modflow.Modflow("Agwater1", version='mfnwt', model_ws=opth) + ag2 = flopy.modflow.ModflowAg.load(os.path.join(opth, agfile), + ml2, nper=49) + + if repr(ag1) != repr(ag2): + raise AssertionError("Ag package comparison failed") + +def test_load_write_agwater_uzf(): + uzffile = "Agwater1.uzf" + ml = flopy.modflow.Modflow("Agwater1", version='mfnwt') + dis = flopy.modflow.ModflowDis(ml, nlay=1, nrow=15, ncol=10, nper=49) + uzf1 = flopy.modflow.ModflowUzf1.load(os.path.join(mpth, uzffile), ml) + + loaded = False + for pak in ml.packagelist: + if isinstance(pak, flopy.modflow.ModflowUzf1): + loaded = True + break + + if not loaded: + raise AssertionError("ModflowUzf1 package not loaded") + + ml.change_model_ws(opth) + uzf1.write_file() + + ml2 = flopy.modflow.Modflow("Agwater1", version='mfnwt', model_ws=opth) + dis2 = flopy.modflow.ModflowDis(ml2, nlay=1, nrow=15, ncol=10, nper=49) + uzf2 = flopy.modflow.ModflowUzf1.load(os.path.join(opth, uzffile), ml2) + + if not np.allclose(uzf1.air_entry.array, uzf2.air_entry.array): + raise AssertionError("Air entry pressure array comparison failed") + + if not np.allclose(uzf1.hroot.array, uzf2.hroot.array): + raise AssertionError("root pressure array comparison failed") + + if not np.allclose(uzf1.rootact.array, uzf2.rootact.array): + raise AssertionError("root activity array comparison failed") + + +if __name__ == "__main__": + test_empty_ag_package() + test_load_write_agwater() + test_load_write_agwater_uzf() \ No newline at end of file diff --git a/examples/data/ag_test/Agwater1.ag b/examples/data/ag_test/Agwater1.ag new file mode 100644 index 000000000..7ee3006df --- /dev/null +++ b/examples/data/ag_test/Agwater1.ag @@ -0,0 +1,567 @@ +# AG options +options +etdemand +irrigation_diversion 1 6 +supplemental_well 6 1 +irrigation_well 6 1 +maxwells 6 +diversionlist -2 +welllist -2 +wellirrlist -2 +diversionirrlist -2 +timeseries_well +timeseries_diversion +timeseries_diversionet +end +# AG time series +time series +well 5 105 +diversion 9 107 +diversionet 9 108 +end +# AG segment list +segment list +9 +end +# AG well list +well list + 1 6 4 -100.00 + 1 6 5 -100.00 + 1 7 4 -100.00 + 1 7 5 -100.00 + 1 8 4 -100.00 + 1 8 5 -100.00 +end +# AG stress period +stress period 1 +IRRdiversion +0 +IRRWELL +0 +SUPWELL +0 +END +stress period 2 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 3 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 4 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 5 +IRRdiversion +1 NUMIRRSEGSP +9 6 0.0 0.0 #SEGID NUMCELLSEG IRRPERIODSEG TRIGGERFACTSEG +6 4 0.0 0.16667 IRRROW IRRCOL EFF_FACT FIELD_FACT +6 5 0.0 0.16667 +7 4 0.0 0.16667 +7 5 0.0 0.16667 +8 4 0.0 0.16667 +8 5 0.0 0.16667 +IRRWELL +6 +1 1 0.0 0.0 #IRRWELLLID NUMCELLWELL IRRPERIODWELL TRIGGERPERIODWELL +6 4 0.0 1.0 IRRROW IRRCOL EFF_FACT FIELD_FACT +2 1 +6 5 0.0 1.0 +3 1 +7 4 0.0 1.0 +4 1 +7 5 0.0 1.0 +5 1 +8 4 0.0 1.0 +6 1 +8 5 0.0 1.0 +SUPWELL +6 NUMSUPWELLLSP +1 1 SUPWELLLNUM NUMSEGWELL +9 1.0 1.0 #SEGWELLID FACSUP FACSUPMAX +2 1 +9 1.0 1.0 +3 1 +9 1.0 1.0 +4 1 +9 1.0 1.0 +5 1 +9 1.0 1.0 +6 1 +9 1.0 1.0 +end +stress period 6 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 7 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 8 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 9 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 10 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 11 +IRRdiversion +0 +IRRWELL +0 +SUPWELL +0 +END +stress period 12 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 13 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 14 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 15 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 16 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 17 +IRRdiversion +1 NUMIRRSEGSP +9 6 0.0 0.0 #SEGID NUMCELLSEG IRRPERIODSEG TRIGGERFACTSEG +6 4 0.0 0.16667 IRRROW IRRCOL EFF_FACT FIELD_FACT +6 5 0.0 0.16667 +7 4 0.0 0.16667 +7 5 0.0 0.16667 +8 4 0.0 0.16667 +8 5 0.0 0.16667 +IRRWELL +6 +1 1 0.0 0.0 #IRRWELLLID NUMCELLWELL IRRPERIODWELL TRIGGERPERIODWELL +6 4 0.0 1.0 IRRROW IRRCOL EFF_FACT FIELD_FACT +2 1 +6 5 0.0 1.0 +3 1 +7 4 0.0 1.0 +4 1 +7 5 0.0 1.0 +5 1 +8 4 0.0 1.0 +6 1 +8 5 0.0 1.0 +SUPWELL +6 NUMSUPWELLLSP +1 1 SUPWELLLNUM NUMSEGWELL +9 1.0 1.0 #SEGWELLID FACSUP FACSUPMAX +2 1 +9 1.0 1.0 +3 1 +9 1.0 1.0 +4 1 +9 1.0 1.0 +5 1 +9 1.0 1.0 +6 1 +9 1.0 1.0 +end +stress period 18 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 19 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 20 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 21 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 22 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 23 +IRRdiversion +0 +IRRWELL +0 +SUPWELL +0 +END +stress period 24 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 25 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 26 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 27 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 28 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 29 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 30 +IRRdiversion +1 NUMIRRSEGSP +9 6 0.0 0.0 #SEGID NUMCELLSEG IRRPERIODSEG TRIGGERFACTSEG +6 4 0.0 0.16667 IRRROW IRRCOL EFF_FACT FIELD_FACT +6 5 0.0 0.16667 +7 4 0.0 0.16667 +7 5 0.0 0.16667 +8 4 0.0 0.16667 +8 5 0.0 0.16667 +IRRWELL +6 +1 1 0.0 0.0 #IRRWELLLID NUMCELLWELL IRRPERIODWELL TRIGGERPERIODWELL +6 4 0.0 1.0 IRRROW IRRCOL EFF_FACT FIELD_FACT +2 1 +6 5 0.0 1.0 +3 1 +7 4 0.0 1.0 +4 1 +7 5 0.0 1.0 +5 1 +8 4 0.0 1.0 +6 1 +8 5 0.0 1.0 +SUPWELL +6 NUMSUPWELLLSP +1 1 SUPWELLLNUM NUMSEGWELL +9 1.0 1.0 #SEGWELLID FACSUP FACSUPMAX +2 1 +9 1.0 1.0 +3 1 +9 1.0 1.0 +4 1 +9 1.0 1.0 +5 1 +9 1.0 1.0 +6 1 +9 1.0 1.0 +end +stress period 31 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 32 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 33 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 34 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 35 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 36 +IRRdiversion +0 +IRRWELL +0 +SUPWELL +0 +END +stress period 37 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 38 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 39 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 40 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 41 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 42 +IRRdiversion +1 NUMIRRSEGSP +9 6 0.0 0.0 #SEGID NUMCELLSEG IRRPERIODSEG TRIGGERFACTSEG +6 4 0.0 0.16667 IRRROW IRRCOL EFF_FACT FIELD_FACT +6 5 0.0 0.16667 +7 4 0.0 0.16667 +7 5 0.0 0.16667 +8 4 0.0 0.16667 +8 5 0.0 0.16667 +IRRWELL +6 +1 1 0.0 0.0 #IRRWELLLID NUMCELLWELL IRRPERIODWELL TRIGGERPERIODWELL +6 4 0.0 1.0 IRRROW IRRCOL EFF_FACT FIELD_FACT +2 1 +6 5 0.0 1.0 +3 1 +7 4 0.0 1.0 +4 1 +7 5 0.0 1.0 +5 1 +8 4 0.0 1.0 +6 1 +8 5 0.0 1.0 +SUPWELL +6 NUMSUPWELLLSP +1 1 SUPWELLLNUM NUMSEGWELL +9 1.0 1.0 #SEGWELLID FACSUP FACSUPMAX +2 1 +9 1.0 1.0 +3 1 +9 1.0 1.0 +4 1 +9 1.0 1.0 +5 1 +9 1.0 1.0 +6 1 +9 1.0 1.0 +end +stress period 43 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 44 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 45 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 46 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 47 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 48 +IRRdiversion +0 +IRRWELL +0 +SUPWELL +0 +END +stress period 49 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 50 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END +stress period 51 +IRRdiversion +-1 +IRRWELL +-1 +SUPWELL +-1 +END \ No newline at end of file diff --git a/examples/data/ag_test/Agwater1.uzf b/examples/data/ag_test/Agwater1.uzf new file mode 100644 index 000000000..0795a96e8 --- /dev/null +++ b/examples/data/ag_test/Agwater1.uzf @@ -0,0 +1,1286 @@ +#UZF Package input for test simulation 2 +options +specifythti +specifythtr +capillaryuzet +rejectsurfk +specifysurfk +end +1 1 1 1 0 61 15 100 4 1.0 NUZTOP IUZFOPT IRUNFLG IETFLG IUZFCB1 IUZFCB2 NTRAIL NSETS NUZGAGES surfdep +INTERNAL 1 (20I4) 6 UZFBND + 1 1 0 0 0 0 0 0 0 0 + 1 1 1 0 0 1 1 1 0 0 + 0 1 1 1 1 1 1 1 0 0 + 1 1 1 1 1 1 1 1 1 0 + 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 1 + 1 1 1 1 1 1 1 1 1 0 + 0 1 1 1 1 1 1 1 1 0 + 0 1 1 1 1 1 1 1 1 0 + 0 1 1 1 1 1 1 1 1 1 + 0 1 1 1 1 1 1 1 1 0 + 1 1 1 1 1 1 1 1 1 0 + 1 1 1 1 1 1 1 1 1 0 + 0 1 1 1 1 1 1 1 1 0 + 0 0 1 1 1 1 0 0 0 0 +INTERNAL 1 (20I4) 6 IRUNBND + 1 1 0 0 0 0 0 0 0 0 + 1 1 1 0 0 3 3 3 0 0 + 0 1 1 1 3 3 3 3 0 0 + 8 8 2 2 2 2 2 3 3 0 + 8 8 8 8 2 2 2 3 4 4 + 8 8 8 8 8 2 2 4 4 4 + 8 8 8 8 8 2 5 5 5 0 + 0 8 8 8 8 2 5 5 5 0 + 0 8 8 8 8 6 6 6 6 0 + 0 8 8 8 8 6 6 6 6 6 + 0 8 8 8 8 8 6 6 7 0 + 8 8 8 8 8 8 6 7 7 0 + 8 8 8 8 8 8 7 7 7 0 + 0 8 8 8 8 8 7 7 7 0 + 0 0 8 8 8 8 0 0 0 0 +INTERNAL 4.6E-5 (10F4.0) 0 VKS + 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 1.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 0.0 0.0 + 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 + 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 + 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 + 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 + 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 + 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 + 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 + 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 + 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 + 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 + 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 + 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 + 0.0 0.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 +INTERNAL 1.0E-5 (10F4.0) 0 surfk + 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 1.0 1.0 1.0 0.0 0.0 1.0 1.0 1.0 0.0 0.0 + 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 0.0 + 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 + 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 + 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 + 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 + 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 + 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 + 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 + 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 + 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 + 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 + 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 0.0 + 0.0 0.0 1.0 1.0 1.0 1.0 0.0 0.0 0.0 0.0 +CONSTANT 7.5 BROOK-COREY EPSILON +CONSTANT 0.38 THTS +CONSTANT 0.2 THTR +CONSTANT 0.2 THTI CONSTANT 0.089 (k=0.64) 0.083 THTI + 6 4 65 1 + 6 5 66 2 + 8 4 67 3 +-68 + 1 NUZF1 STRESS PERIOD 1 +INTERNAL 1.000E-10 (10F4.0) 0 FINF STRESS PERIOD 1 + 1.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 + 2.0 1.0 2.0 0.0 0.0 8.0 8.0 5.0 0.0 0.0 + 0.0 5.0 1.0 1.0 8.0 8.0 5.0 5.0 0.0 0.0 + 8.0 5.0 1.0 1.0 1.0 1.0 1.0 1.0 2.0 0.0 + 8.0 5.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 + 8.0 5.0 5.0 2.0 2.0 1.0 1.0 1.0 1.0 5.0 + 8.0 5.0 5.0 2.0 2.0 1.0 1.0 2.0 2.0 0.0 + 0.0 5.0 5.0 2.0 2.0 1.0 1.0 2.0 5.0 0.0 + 0.0 5.0 5.0 2.0 2.0 1.0 1.0 2.0 5.0 0.0 + 0.0 5.0 5.0 2.0 2.0 1.0 1.0 2.0 5.0 8.0 + 0.0 1.0 1.0 1.0 1.0 1.0 1.0 2.0 5.0 0.0 + 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 2.0 0.0 + 1.0 1.0 2.0 2.0 2.0 2.0 2.0 1.0 1.0 0.0 + 0.0 2.0 5.0 5.0 5.0 5.0 5.0 2.0 1.0 0.0 + 0.0 0.0 8.0 8.0 8.0 8.0 0.0 0.0 0.0 0.0 + 1 NUZF2 STRESS PERIOD 1 +CONSTANT 1.0E-08 PET STRESS PERIOD 1 + 1 NUZF3 STRESS PERIOD 1 +CONSTANT 0.5 EXTDPTH STRESS PERIOD 1 + 1 NUZF4 STRESS PERIOD 1 +CONSTANT 0.2 EXTWC +1 NUZF5 STRESS PERIOD 1 +CONSTANT -1.1 AIR ENTRY STRESS PERIOD 1 +1 NUZF6 STRESS PERIOD 1 +CONSTANT -75.0 ROOT PRESSURE +1 NUZF7 STRESS PERIOD 1 +CONSTANT 1.0 ROOT ACTIVITY +1 NUZF1 STRESS PERIOD 2 January +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 2 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 2 +CONSTANT 5.00E-10 PET STRESS PERIOD 2 +-1 NUZF3 STRESS PERIOD 2 +-1 NUZF4 STRESS PERIOD 2 +-1 NUZF5 STRESS PERIOD 2 +-1 NUZF6 STRESS PERIOD 2 +-1 NUZF7 STRESS PERIOD 2 +1 NUZF1 STRESS PERIOD 3 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 3 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 3 +CONSTANT 5.00E-10 PET STRESS PERIOD 3 +-1 NUZF3 STRESS PERIOD 3 +-1 NUZF4 STRESS PERIOD 3 +-1 NUZF5 STRESS PERIOD 3 +-1 NUZF6 STRESS PERIOD 3 +-1 NUZF7 STRESS PERIOD 3 +1 NUZF1 STRESS PERIOD 4 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 4 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 4 +CONSTANT 5.00E-10 PET STRESS PERIOD 4 +-1 NUZF3 STRESS PERIOD 4 +-1 NUZF4 STRESS PERIOD 4 +-1 NUZF5 STRESS PERIOD 4 +-1 NUZF6 STRESS PERIOD 4 +-1 NUZF7 STRESS PERIOD 4 +1 NUZF1 STRESS PERIOD 5 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 5 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 5 +CONSTANT 2.50E-08 PET STRESS PERIOD 5 +-1 NUZF3 STRESS PERIOD 5 +-1 NUZF4 STRESS PERIOD 5 +-1 NUZF5 STRESS PERIOD 5 +-1 NUZF6 STRESS PERIOD 5 +-1 NUZF7 STRESS PERIOD 5 +1 NUZF1 STRESS PERIOD 6 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 6 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 6 +CONSTANT 5.00E-08 PET STRESS PERIOD 6 +-1 NUZF3 STRESS PERIOD 6 +-1 NUZF4 STRESS PERIOD 6 +-1 NUZF5 STRESS PERIOD 6 +-1 NUZF6 STRESS PERIOD 6 +-1 NUZF7 STRESS PERIOD 6 +1 NUZF1 STRESS PERIOD 7 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 7 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 7 +CONSTANT 1.50E-07 PET STRESS PERIOD 7 +-1 NUZF3 STRESS PERIOD 7 +-1 NUZF4 STRESS PERIOD 7 +-1 NUZF5 STRESS PERIOD 7 +-1 NUZF6 STRESS PERIOD 7 +-1 NUZF7 STRESS PERIOD 7 +1 NUZF1 STRESS PERIOD 8 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 8 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 8 +CONSTANT 4.00E-07 PET STRESS PERIOD 8 +-1 NUZF3 STRESS PERIOD 8 +-1 NUZF4 STRESS PERIOD 8 +-1 NUZF5 STRESS PERIOD 8 +-1 NUZF6 STRESS PERIOD 8 +-1 NUZF7 STRESS PERIOD 8 +1 NUZF1 STRESS PERIOD 9 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 9 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 9 +CONSTANT 3.25E-07 PET STRESS PERIOD 9 +-1 NUZF3 STRESS PERIOD 9 +-1 NUZF4 STRESS PERIOD 9 +-1 NUZF5 STRESS PERIOD 9 +-1 NUZF6 STRESS PERIOD 9 +-1 NUZF7 STRESS PERIOD 9 +1 NUZF1 STRESS PERIOD 10 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 10 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 10 +CONSTANT 7.50E-08 PET STRESS PERIOD 10 +-1 NUZF3 STRESS PERIOD 10 +-1 NUZF4 STRESS PERIOD 10 +-1 NUZF5 STRESS PERIOD 10 +-1 NUZF6 STRESS PERIOD 10 +-1 NUZF7 STRESS PERIOD 10 +1 NUZF1 STRESS PERIOD 11 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 11 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 11 +CONSTANT 5.00E-09 PET STRESS PERIOD 11 +-1 NUZF3 STRESS PERIOD 11 +-1 NUZF4 STRESS PERIOD 11 +-1 NUZF5 STRESS PERIOD 11 +-1 NUZF6 STRESS PERIOD 11 +-1 NUZF7 STRESS PERIOD 11 +1 NUZF1 STRESS PERIOD 12 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 12 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 12 +CONSTANT 5.00E-10 PET STRESS PERIOD 12 +-1 NUZF3 STRESS PERIOD 12 +-1 NUZF4 STRESS PERIOD 12 +-1 NUZF5 STRESS PERIOD 12 +-1 NUZF6 STRESS PERIOD 12 +-1 NUZF7 STRESS PERIOD 12 +1 NUZF1 STRESS PERIOD 13 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 13 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 13 +CONSTANT 5.00E-10 PET STRESS PERIOD 13 +-1 NUZF3 STRESS PERIOD 13 +-1 NUZF4 STRESS PERIOD 13 +-1 NUZF5 STRESS PERIOD 13 +-1 NUZF6 STRESS PERIOD 13 +-1 NUZF7 STRESS PERIOD 13 +1 NUZF1 STRESS PERIOD 14 January +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 14 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 14 +CONSTANT 5.00E-10 PET STRESS PERIOD 14 +-1 NUZF3 STRESS PERIOD 14 +-1 NUZF4 STRESS PERIOD 14 +-1 NUZF5 STRESS PERIOD 14 +-1 NUZF6 STRESS PERIOD 14 +-1 NUZF7 STRESS PERIOD 14 +1 NUZF1 STRESS PERIOD 15 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 15 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 15 +CONSTANT 5.00E-10 PET STRESS PERIOD 15 +-1 NUZF3 STRESS PERIOD 15 +-1 NUZF4 STRESS PERIOD 15 +-1 NUZF5 STRESS PERIOD 15 +-1 NUZF6 STRESS PERIOD 15 +-1 NUZF7 STRESS PERIOD 15 +1 NUZF1 STRESS PERIOD 16 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 16 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 16 +CONSTANT 5.00E-10 PET STRESS PERIOD 16 +-1 NUZF3 STRESS PERIOD 16 +-1 NUZF4 STRESS PERIOD 16 +-1 NUZF5 STRESS PERIOD 16 +-1 NUZF6 STRESS PERIOD 16 +-1 NUZF7 STRESS PERIOD 16 +1 NUZF1 STRESS PERIOD 17 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 17 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 17 +CONSTANT 2.50E-08 PET STRESS PERIOD 17 +-1 NUZF3 STRESS PERIOD 17 +-1 NUZF4 STRESS PERIOD 17 +-1 NUZF5 STRESS PERIOD 17 +-1 NUZF6 STRESS PERIOD 17 +-1 NUZF7 STRESS PERIOD 17 +1 NUZF1 STRESS PERIOD 18 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 18 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 18 +CONSTANT 5.00E-08 PET STRESS PERIOD 18 +-1 NUZF3 STRESS PERIOD 18 +-1 NUZF4 STRESS PERIOD 18 +-1 NUZF5 STRESS PERIOD 18 +-1 NUZF6 STRESS PERIOD 18 +-1 NUZF7 STRESS PERIOD 18 +1 NUZF1 STRESS PERIOD 19 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 19 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 19 +CONSTANT 1.50E-07 PET STRESS PERIOD 19 +-1 NUZF3 STRESS PERIOD 19 +-1 NUZF4 STRESS PERIOD 19 +-1 NUZF5 STRESS PERIOD 19 +-1 NUZF6 STRESS PERIOD 19 +-1 NUZF7 STRESS PERIOD 19 +1 NUZF1 STRESS PERIOD 20 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 20 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 20 +CONSTANT 4.00E-07 PET STRESS PERIOD 20 +-1 NUZF3 STRESS PERIOD 20 +-1 NUZF4 STRESS PERIOD 20 +-1 NUZF5 STRESS PERIOD 20 +-1 NUZF6 STRESS PERIOD 20 +-1 NUZF7 STRESS PERIOD 20 +1 NUZF1 STRESS PERIOD 21 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 21 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 21 +CONSTANT 3.25E-07 PET STRESS PERIOD 21 +-1 NUZF3 STRESS PERIOD 21 +-1 NUZF4 STRESS PERIOD 21 +-1 NUZF5 STRESS PERIOD 21 +-1 NUZF6 STRESS PERIOD 21 +-1 NUZF7 STRESS PERIOD 21 +1 NUZF1 STRESS PERIOD 22 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 22 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 22 +CONSTANT 7.50E-08 PET STRESS PERIOD 22 +-1 NUZF3 STRESS PERIOD 22 +-1 NUZF4 STRESS PERIOD 22 +-1 NUZF5 STRESS PERIOD 22 +-1 NUZF6 STRESS PERIOD 22 +-1 NUZF7 STRESS PERIOD 22 +1 NUZF1 STRESS PERIOD 23 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 23 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 23 +CONSTANT 5.00E-09 PET STRESS PERIOD 23 +-1 NUZF3 STRESS PERIOD 23 +-1 NUZF4 STRESS PERIOD 23 +-1 NUZF5 STRESS PERIOD 23 +-1 NUZF6 STRESS PERIOD 23 +-1 NUZF7 STRESS PERIOD 23 +1 NUZF1 STRESS PERIOD 24 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 24 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 24 +CONSTANT 5.00E-10 PET STRESS PERIOD 24 +-1 NUZF3 STRESS PERIOD 24 +-1 NUZF4 STRESS PERIOD 24 +-1 NUZF5 STRESS PERIOD 24 +-1 NUZF6 STRESS PERIOD 24 +-1 NUZF7 STRESS PERIOD 24 +1 NUZF1 STRESS PERIOD 25 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 25 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 25 +CONSTANT 5.00E-10 PET STRESS PERIOD 25 +-1 NUZF3 STRESS PERIOD 25 +-1 NUZF4 STRESS PERIOD 25 +-1 NUZF5 STRESS PERIOD 25 +-1 NUZF6 STRESS PERIOD 25 +-1 NUZF7 STRESS PERIOD 25 +1 NUZF1 STRESS PERIOD 26 January +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 26 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 26 +CONSTANT 5.00E-10 PET STRESS PERIOD 26 +-1 NUZF3 STRESS PERIOD 26 +-1 NUZF4 STRESS PERIOD 26 +-1 NUZF5 STRESS PERIOD 26 +-1 NUZF6 STRESS PERIOD 26 +-1 NUZF7 STRESS PERIOD 26 +1 NUZF1 STRESS PERIOD 27 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 27 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 27 +CONSTANT 5.00E-10 PET STRESS PERIOD 27 +-1 NUZF3 STRESS PERIOD 27 +-1 NUZF4 STRESS PERIOD 27 +-1 NUZF5 STRESS PERIOD 27 +-1 NUZF6 STRESS PERIOD 27 +-1 NUZF7 STRESS PERIOD 27 +1 NUZF1 STRESS PERIOD 28 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 28 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 28 +CONSTANT 5.00E-10 PET STRESS PERIOD 28 +-1 NUZF3 STRESS PERIOD 28 +-1 NUZF4 STRESS PERIOD 28 +-1 NUZF5 STRESS PERIOD 28 +-1 NUZF6 STRESS PERIOD 28 +-1 NUZF7 STRESS PERIOD 28 +1 NUZF1 STRESS PERIOD 29 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 29 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 29 +CONSTANT 2.50E-08 PET STRESS PERIOD 29 +-1 NUZF3 STRESS PERIOD 29 +-1 NUZF4 STRESS PERIOD 29 +-1 NUZF5 STRESS PERIOD 29 +-1 NUZF6 STRESS PERIOD 29 +-1 NUZF7 STRESS PERIOD 29 +1 NUZF1 STRESS PERIOD 30 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 30 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 30 +CONSTANT 5.00E-08 PET STRESS PERIOD 30 +-1 NUZF3 STRESS PERIOD 30 +-1 NUZF4 STRESS PERIOD 30 +-1 NUZF5 STRESS PERIOD 30 +-1 NUZF6 STRESS PERIOD 30 +-1 NUZF7 STRESS PERIOD 30 +1 NUZF1 STRESS PERIOD 31 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 31 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 31 +CONSTANT 1.50E-07 PET STRESS PERIOD 31 +-1 NUZF3 STRESS PERIOD 31 +-1 NUZF4 STRESS PERIOD 31 +-1 NUZF5 STRESS PERIOD 31 +-1 NUZF6 STRESS PERIOD 31 +-1 NUZF7 STRESS PERIOD 31 +1 NUZF1 STRESS PERIOD 32 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 32 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 32 +CONSTANT 4.00E-07 PET STRESS PERIOD 32 +-1 NUZF3 STRESS PERIOD 32 +-1 NUZF4 STRESS PERIOD 32 +-1 NUZF5 STRESS PERIOD 32 +-1 NUZF6 STRESS PERIOD 32 +-1 NUZF7 STRESS PERIOD 32 +1 NUZF1 STRESS PERIOD 33 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 33 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 33 +CONSTANT 3.25E-07 PET STRESS PERIOD 33 +-1 NUZF3 STRESS PERIOD 33 +-1 NUZF4 STRESS PERIOD 33 +-1 NUZF5 STRESS PERIOD 33 +-1 NUZF6 STRESS PERIOD 33 +-1 NUZF7 STRESS PERIOD 33 +1 NUZF1 STRESS PERIOD 34 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 34 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 34 +CONSTANT 7.50E-08 PET STRESS PERIOD 34 +-1 NUZF3 STRESS PERIOD 34 +-1 NUZF4 STRESS PERIOD 34 +-1 NUZF5 STRESS PERIOD 34 +-1 NUZF6 STRESS PERIOD 34 +-1 NUZF7 STRESS PERIOD 34 +1 NUZF1 STRESS PERIOD 35 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 35 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 35 +CONSTANT 5.00E-09 PET STRESS PERIOD 35 +-1 NUZF3 STRESS PERIOD 35 +-1 NUZF4 STRESS PERIOD 35 +-1 NUZF5 STRESS PERIOD 35 +-1 NUZF6 STRESS PERIOD 35 +-1 NUZF7 STRESS PERIOD 35 +1 NUZF1 STRESS PERIOD 36 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 36 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 36 +CONSTANT 5.00E-10 PET STRESS PERIOD 36 +-1 NUZF3 STRESS PERIOD 36 +-1 NUZF4 STRESS PERIOD 36 +-1 NUZF5 STRESS PERIOD 36 +-1 NUZF6 STRESS PERIOD 36 +-1 NUZF7 STRESS PERIOD 36 +1 NUZF1 STRESS PERIOD 37 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 37 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 37 +CONSTANT 5.00E-10 PET STRESS PERIOD 37 +-1 NUZF3 STRESS PERIOD 37 +-1 NUZF4 STRESS PERIOD 37 +-1 NUZF5 STRESS PERIOD 37 +-1 NUZF6 STRESS PERIOD 37 +-1 NUZF7 STRESS PERIOD 37 +1 NUZF1 STRESS PERIOD 38 January +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 38 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 38 +CONSTANT 5.00E-10 PET STRESS PERIOD 38 +-1 NUZF3 STRESS PERIOD 38 +-1 NUZF4 STRESS PERIOD 38 +-1 NUZF5 STRESS PERIOD 38 +-1 NUZF6 STRESS PERIOD 38 +-1 NUZF7 STRESS PERIOD 38 +1 NUZF1 STRESS PERIOD 39 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 39 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 39 +CONSTANT 5.00E-10 PET STRESS PERIOD 39 +-1 NUZF3 STRESS PERIOD 39 +-1 NUZF4 STRESS PERIOD 39 +-1 NUZF5 STRESS PERIOD 39 +-1 NUZF6 STRESS PERIOD 39 +-1 NUZF7 STRESS PERIOD 39 +1 NUZF1 STRESS PERIOD 40 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 40 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 40 +CONSTANT 5.00E-10 PET STRESS PERIOD 40 +-1 NUZF3 STRESS PERIOD 40 +-1 NUZF4 STRESS PERIOD 40 +-1 NUZF5 STRESS PERIOD 40 +-1 NUZF6 STRESS PERIOD 40 +-1 NUZF7 STRESS PERIOD 40 +1 NUZF1 STRESS PERIOD 41 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 41 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 41 +CONSTANT 2.50E-08 PET STRESS PERIOD 41 +-1 NUZF3 STRESS PERIOD 41 +-1 NUZF4 STRESS PERIOD 41 +-1 NUZF5 STRESS PERIOD 41 +-1 NUZF6 STRESS PERIOD 41 +-1 NUZF7 STRESS PERIOD 41 +1 NUZF1 STRESS PERIOD 42 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 42 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 42 +CONSTANT 5.00E-08 PET STRESS PERIOD 42 +-1 NUZF3 STRESS PERIOD 42 +-1 NUZF4 STRESS PERIOD 42 +-1 NUZF5 STRESS PERIOD 42 +-1 NUZF6 STRESS PERIOD 42 +-1 NUZF7 STRESS PERIOD 42 +1 NUZF1 STRESS PERIOD 42 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 42 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 42 +CONSTANT 1.50E-07 PET STRESS PERIOD 42 +-1 NUZF3 STRESS PERIOD 42 +-1 NUZF4 STRESS PERIOD 42 +-1 NUZF5 STRESS PERIOD 42 +-1 NUZF6 STRESS PERIOD 42 +-1 NUZF7 STRESS PERIOD 42 +1 NUZF1 STRESS PERIOD 43 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 43 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 43 +CONSTANT 4.00E-07 PET STRESS PERIOD 43 +-1 NUZF3 STRESS PERIOD 43 +-1 NUZF4 STRESS PERIOD 43 +-1 NUZF5 STRESS PERIOD 43 +-1 NUZF6 STRESS PERIOD 43 +-1 NUZF7 STRESS PERIOD 43 +1 NUZF1 STRESS PERIOD 44 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 44 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 44 +CONSTANT 3.25E-07 PET STRESS PERIOD 44 +-1 NUZF3 STRESS PERIOD 44 +-1 NUZF4 STRESS PERIOD 44 +-1 NUZF5 STRESS PERIOD 44 +-1 NUZF6 STRESS PERIOD 44 +-1 NUZF7 STRESS PERIOD 44 +1 NUZF1 STRESS PERIOD 45 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 45 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 45 +CONSTANT 7.50E-08 PET STRESS PERIOD 45 +-1 NUZF3 STRESS PERIOD 45 +-1 NUZF4 STRESS PERIOD 45 +-1 NUZF5 STRESS PERIOD 45 +-1 NUZF6 STRESS PERIOD 45 +-1 NUZF7 STRESS PERIOD 45 +1 NUZF1 STRESS PERIOD 46 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 46 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 46 +CONSTANT 5.00E-09 PET STRESS PERIOD 46 +-1 NUZF3 STRESS PERIOD 46 +-1 NUZF4 STRESS PERIOD 46 +-1 NUZF5 STRESS PERIOD 46 +-1 NUZF6 STRESS PERIOD 46 +-1 NUZF7 STRESS PERIOD 46 +1 NUZF1 STRESS PERIOD 47 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 47 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 47 +CONSTANT 5.00E-10 PET STRESS PERIOD 47 +-1 NUZF3 STRESS PERIOD 47 +-1 NUZF4 STRESS PERIOD 47 +-1 NUZF5 STRESS PERIOD 47 +-1 NUZF6 STRESS PERIOD 47 +-1 NUZF7 STRESS PERIOD 47 +1 NUZF1 STRESS PERIOD 48 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 48 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 48 +CONSTANT 5.00E-10 PET STRESS PERIOD 48 +-1 NUZF3 STRESS PERIOD 48 +-1 NUZF4 STRESS PERIOD 48 +-1 NUZF5 STRESS PERIOD 48 +-1 NUZF6 STRESS PERIOD 48 +-1 NUZF7 STRESS PERIOD 48 +1 NUZF1 STRESS PERIOD 48 +INTERNAL 1.00E-10 (FREE) 0 FINF STRESS PERIOD 49 +1 2 0 0 0 0 0 0 0 0 +2 1 2 0 0 8 8 5 0 0 +0 5 1 1 8 8 5 5 0 0 +8 5 1 1 1 1 1 1 2 0 +8 5 1 1 1 1 1 1 1 1 +8 5 5 2 2 1 1 1 1 5 +8 5 5 2 2 1 1 2 2 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 0 +0 5 5 2 2 1 1 2 5 8 +0 1 1 1 1 1 1 2 5 0 +1 1 1 1 1 1 1 1 2 0 +1 1 2 2 2 2 2 1 1 0 +0 2 5 5 5 5 5 2 1 0 +0 0 8 8 8 8 0 0 0 0 +1 NUZF2 STRESS PERIOD 49 +CONSTANT 5.00E-10 PET STRESS PERIOD 49 +-1 NUZF3 STRESS PERIOD 49 +-1 NUZF4 STRESS PERIOD 49 +-1 NUZF5 STRESS PERIOD 49 +-1 NUZF6 STRESS PERIOD 49 +-1 NUZF7 STRESS PERIOD 49 \ No newline at end of file diff --git a/flopy/modflow/__init__.py b/flopy/modflow/__init__.py index c9dae5c6d..4efae3f19 100644 --- a/flopy/modflow/__init__.py +++ b/flopy/modflow/__init__.py @@ -1,4 +1,5 @@ from .mf import Modflow +from .mfag import ModflowAg from .mfbas import ModflowBas from .mfbcf import ModflowBcf from .mflpf import ModflowLpf diff --git a/flopy/modflow/mf.py b/flopy/modflow/mf.py index da5214ecf..8282390f0 100644 --- a/flopy/modflow/mf.py +++ b/flopy/modflow/mf.py @@ -157,6 +157,7 @@ def __init__(self, modelname='modflowtest', namefile_ext='nam', self.mfnam_packages = { "zone": flopy.modflow.ModflowZon, "mult": flopy.modflow.ModflowMlt, + "ag": flopy.modflow.ModflowAg, "pval": flopy.modflow.ModflowPval, "bas6": flopy.modflow.ModflowBas, "dis": flopy.modflow.ModflowDis, diff --git a/flopy/modflow/mfag.py b/flopy/modflow/mfag.py new file mode 100644 index 000000000..3bb0100cd --- /dev/null +++ b/flopy/modflow/mfag.py @@ -0,0 +1,861 @@ +""" +mfag module which contains the ModflowAg class. + +Note that the user can access the ModflowAg class as `flopy.modflow.ModflowAg`. + +Additional information for this MODFLOW package can be found at +`_. + +""" + +import os +import numpy as np +from ..utils.flopy_io import multi_line_strip +from ..pakbase import Package +from ..utils.recarray_utils import create_empty_recarray +from ..utils.optionblock import OptionBlock +from collections import OrderedDict + + +class ModflowAg(Package): + """ + The ModflowAg class is used to build read, write, and edit data + from the MODFLOW-NWT AG package. + + Parameters + ---------- + model : flopy.modflow.Modflow object + model object + options : flopy.utils.OptionBlock object + option block object + time_series : np.recarray + numpy recarray for the time series block + well_list : np.recarray + recarray of the well_list block + irrdiversion : dict {per: np.recarray} + dictionary of the irrdiversion block + irrwell : dict {per: np.recarray} + dictionary of the irrwell block + supwell : dict {per: np.recarray} + dictionary of the supwell block + extension : str, optional + default is .ag + unitnumber : list, optional + fortran unit number for modflow, default 69 + filenames : list, optional + file name for ModflowAwu package to write input + nper : int + number of stress periods in the model + + Examples + -------- + + load a ModflowAg file + + >>> import flopy + >>> ml = flopy.modflow.Modflow('agtest') + >>> ag = flopy.modflow.ModflowAg.load('test.ag', ml, nper=2) + + """ + _options = OrderedDict( + [('noprint', OptionBlock.simple_flag), + ('irrigation_diversion', + {OptionBlock.dtype: np.bool_, + OptionBlock.nested: True, + OptionBlock.n_nested: 2, + OptionBlock.vars: OrderedDict( + [('numirrdiversions', OptionBlock.simple_int), + ('maxcellsdiversion', OptionBlock.simple_int)] + )}), + ('irrigation_well', {OptionBlock.dtype: np.bool_, + OptionBlock.nested: True, + OptionBlock.n_nested: 2, + OptionBlock.vars: OrderedDict( + [("numirrwells", OptionBlock.simple_int), + ('maxcellswell', OptionBlock.simple_int)] + )}), + ('supplemental_well', {OptionBlock.dtype: np.bool_, + OptionBlock.nested: True, + OptionBlock.n_nested: 2, + OptionBlock.vars: OrderedDict( + [("numsupwells", OptionBlock.simple_int), + ("maxdiversions", OptionBlock.simple_int)] + )}), + ('maxwells', {OptionBlock.dtype: np.bool_, + OptionBlock.nested: True, + OptionBlock.n_nested: 1, + OptionBlock.vars: OrderedDict( + [('nummaxwell', OptionBlock.simple_int)] + )}), + ('tabfiles', OptionBlock.simple_tabfile), + ('phiramp', OptionBlock.simple_flag), + ('etdemand', OptionBlock.simple_flag), + ('trigger', OptionBlock.simple_flag), + ('timeseries_diversion', OptionBlock.simple_flag), + ('timeseries_well', OptionBlock.simple_flag), + ('timeseries_diversionet', OptionBlock.simple_flag), + ('timeseries_wellet', OptionBlock.simple_flag), + ('diversionlist', {OptionBlock.dtype: np.bool_, + OptionBlock.nested: True, + OptionBlock.n_nested: 1, + OptionBlock.vars: OrderedDict( + [('unit_diversionlist', + OptionBlock.simple_int)] + )}), + ('welllist', {OptionBlock.dtype: np.bool_, + OptionBlock.nested: True, + OptionBlock.n_nested: 1, + OptionBlock.vars: OrderedDict( + [('unit_welllist', + OptionBlock.simple_int)] + )}), + ('wellirrlist', {OptionBlock.dtype: np.bool_, + OptionBlock.nested: True, + OptionBlock.n_nested: 1, + OptionBlock.vars: OrderedDict( + [('unit_wellirrlist', + OptionBlock.simple_int)] + )}), + ('diversionirrlist', {OptionBlock.dtype: np.bool_, + OptionBlock.nested: True, + OptionBlock.n_nested: 1, + OptionBlock.vars: OrderedDict( + [('unit_diversionirrlist', + OptionBlock.simple_int)] + )}), + ('wellcbc', {OptionBlock.dtype: np.bool_, + OptionBlock.nested: True, + OptionBlock.n_nested: 1, + OptionBlock.vars: OrderedDict( + [('unitcbc', OptionBlock.simple_int)] + )}) + ]) + + def __init__(self, model, options=None, time_series=None, well_list=None, + irrdiversion=None, irrwell=None, supwell=None, + extension="ag", unitnumber=None, filenames=None, nper=0): + + if "nwt" not in model.version: + raise AssertionError("Model version must be mfnwt " + "to use the AG package") + + # setup the package parent class + if unitnumber is None: + unitnumber = ModflowAg.defaultunit() + + if filenames is None: + filenames = [None] + elif isinstance(filenames, str): + filenames = [filenames] + + name = [ModflowAg.ftype()] + units = [unitnumber] + extra = [""] + + # set package name + fname = [filenames[0]] + + super(ModflowAg, self).__init__(model, extension=extension, + name=name, unit_number=units, + extra=extra, filenames=fname) + + # set up class + self.heading = "# {} package for {}, generated " \ + "by flopy\n".format(self.name[0], + model.version_types[model.version]) + self.url = "ag.htm" + + # options + self.noprint = None + self.irrigation_diversion = False + self.numirrdiversions = 0 + self.maxcellsdiversion = 0 + self.irrigation_well = False + self.numirrwells = 0 + self.supplemental_well = False + self.numsupwells = 0 + self.maxdiversions = 0 + self.maxwells = False + self.nummaxwell = 0 + self.tabfiles = False + self.numtab = 0 + self.maxval = 0 + self.phiramp = False + self.etdemand = False + self.trigger = False + self.timeseries_diversion = False + self.timeseries_well = False + self.timeseries_diversionet = False + self.timeseries_wellet = False + self.diversionlist = False + self.unit_diversionlist = None + self.welllist = False + self.unit_welllist = None + self.wellirrlist = False + self.unit_wellirrlist = None + self.diversionirrlist = False + self.unit_diversionirrlist = None + self.wellcbc = False + self.unitcbc = None + + if isinstance(options, OptionBlock): + self.options = options + self._update_attrs_from_option_block(options) + else: + self.options = OptionBlock("", ModflowAg) + + self.time_series = time_series + self.well_list = well_list + self.irrdiversion = irrdiversion + self.irrwell = irrwell + self.supwell = supwell + + self._nper = self.parent.nper + if self.parent.nper == 0: + self._nper = nper + + self.parent.add_package(self) + + @property + def segment_list(self): + """ + Method to get a unique list of segments from irrdiversion + + Returns + ------- + list + """ + segments = [] + if self.irrdiversion is not None: + for _, recarray in self.irrdiversion.items(): + if np.isscalar(recarray): + continue + t = np.unique(recarray["segid"]) + for seg in t: + segments.append(seg) + + segments = list(set(segments)) + + return segments + + def _update_attrs_from_option_block(self, options): + """ + Method to update option attributes from the + option block + + Parameters + ---------- + options : OptionBlock object + + """ + for key, ctx in options._context.items(): + if key in options.__dict__: + val = options.__dict__[key] + self.__setattr__(key, val) + if ctx[OptionBlock.nested]: + for k2, _ in ctx[OptionBlock.vars].items(): + if k2 in options.__dict__: + v2 = options.__dict__[k2] + self.__setattr__(k2, v2) + + def write_file(self, check=False): + """ + Write method for ModflowAg + + Parameters + ---------- + check: bool + not implemented + """ + ws = self.parent.model_ws + name = self.file_name[0] + with open(os.path.join(ws, name), "w") as foo: + foo.write(self.heading) + + # update options + self.options.update_from_package(self) + self.options.write_options(foo) + + # check if there is a timeseries block and write output + if self.time_series is not None: + foo.write("# ag time series\n") + fmt = "{} {:d} {:d}\n" + foo.write("TIME SERIES \n") + for record in self.time_series: + if record["keyword"] in ('welletall', 'wellall'): + foo.write("{} {:d}\n".format(record['keyword'], + record['unit']).upper()) + else: + foo.write(fmt.format(*record).upper()) + + foo.write("END \n") + + # check if item 12 exists and write item 12 - 14 + if self.segment_list is not None: + foo.write('# segment list for irriagation diversions\n') + foo.write("SEGMENT LIST\n") + for iseg in self.segment_list: + foo.write("{:d}\n".format(iseg)) + + foo.write("END \n") + + # check if item 15 exists and write item 15 through 17 + if self.well_list is not None: + foo.write("# ag well list\n") + foo.write("WELL LIST \n") + if self.tabfiles: + # item 16a + fmt16a = True + fmt16 = "{:d} {:d} {:d} {:d} {:d}\n" + else: + # item 16b + fmt16a = False + fmt16 = "{:d} {:d} {:d} {:f}\n" + + for record in self.well_list: + if fmt16a: + foo.write(fmt16.format(record["unit"], + record["tabval"], + record["k"] + 1, + record["i"] + 1, + record["j"] + 1)) + else: + foo.write(fmt16.format(record["k"] + 1, + record["i"] + 1, + record["j"] + 1, + record["flux"])) + + foo.write("END \n") + + foo.write("# ag stress period data\n") + for per in range(self._nper): + foo.write("STRESS PERIOD {}\n".format(per + 1)) + + # check for item 18 and write items 18 - 21 + if self.irrdiversion is not None: + foo.write("IRRDIVERSION \n") + + if self.trigger: + # item 20 + fmt20 = "{:d} {:d} {:f} {:f}\n" + else: + # item 20, if trigger option is false we need 0's for + # period and trigger fac. + fmt20 = "{:d} {:d} 0 0\n" + + if per in self.irrdiversion: + if np.isscalar(self.irrdiversion[per]): + # write item 19 + foo.write("-1 \n") + else: + recarray = self.irrdiversion[per] + + # write item 19 + foo.write("{:d} \n".format(len(recarray))) + fmt21 = "{:d} {:d} {:f} {:f}\n" + + for rec in recarray: + num = rec['numcell'] + if self.trigger: + foo.write(fmt20.format(rec['segid'], + rec['numcell'], + rec['period'], + rec['triggerfact'])) + else: + foo.write(fmt20.format(rec['segid'], + rec['numcell'])) + + for i in range(num): + foo.write(fmt21.format( + rec['i{}'.format(i)] + 1, + rec["j{}".format(i)] + 1, + rec["eff_fact{}".format(i)], + rec['field_fact{}'.format(i)])) + + else: + # write item 19 + foo.write("0 \n") + + # check for item 22 and write 22 - 25 + if self.irrwell is not None: + foo.write("IRRWELL \n") + + if self.trigger: + # item 24 + fmt24 = "{:d} {:d} {:f} {:f}\n" + else: + # item 24 + fmt24 = "{:d} {:d} 0 0\n" + + if per in self.irrwell: + if np.isscalar(self.irrwell[per]): + foo.write("-1 \n") + else: + recarray = self.irrwell[per] + + # write item 23 + foo.write("{:d} \n".format(len(recarray))) + fmt25 = "{:d} {:d} {:f} {:f}\n" + + for rec in recarray: + num = rec['numcell'] + if self.trigger: + foo.write(fmt24.format(rec['wellid'] + 1, + rec['numcell'], + rec['period'], + rec['triggerfact'])) + else: + foo.write(fmt24.format(rec['wellid'] + 1, + rec['numcell'])) + + for i in range(num): + foo.write(fmt25.format( + rec['i{}'.format(i)] + 1, + rec["j{}".format(i)] + 1, + rec["eff_fact{}".format(i)], + rec['field_fact{}'.format(i)])) + else: + # write item 23 + foo.write("0 \n") + + # check if item 26 and write items 26 - 29 + if self.supwell is not None: + foo.write("SUPWELL \n") + + fmt28 = "{:d} {:d}\n" + + if per in self.supwell: + if np.isscalar(self.supwell[per]): + foo.write("-1 \n") + else: + recarray = self.supwell[per] + + # write item 27 + foo.write("{:d} \n".format(len(recarray))) + + for rec in recarray: + num = rec['numcell'] + + foo.write(fmt28.format(rec["wellid"] + 1, + rec["numcell"])) + + for i in range(num): + if rec["fracsupmax{}".format(i)] != -1e+10: + foo.write( + "{:d} {:f} {:f}\n".format( + rec['segid{}'.format(i)], + rec['fracsup{}'.format(i)], + rec['fracsupmax{}'.format(i)])) + + else: + foo.write("{:d} {:f}\n".format( + rec['segid{}'.format(i)], + rec['fracsup{}'.format(i)])) + + else: + # write item 27 + foo.write("0 \n") + + foo.write("END \n") + + @staticmethod + def get_empty(numrecords, maxells=0, block="well"): + """ + Creates an empty record array corresponding to the block data type + it is associated with. + + Parameters + ---------- + numrecords : int + number of records to create recarray with + maxells : int, optional + maximum number of irrigation links + block : str + str which indicates data set valid options are + "well" , + "tabfile_well" , + "timeseries" , + "irrdiversion_modflow" , + "irrdiversion_gsflow" , + "irrwell_modflow" , + "irrwell_gsflow" , + "supwell" + + Returns + ------- + np.recarray + + """ + dtype = ModflowAg.get_default_dtype(maxells=maxells, block=block) + return create_empty_recarray(numrecords, dtype, default_value=-1.0E+10) + + @staticmethod + def get_default_dtype(maxells=0, block="well"): + """ + Function that gets a default dtype for a block + + Parameters + ---------- + maxells : int + maximum number of irrigation links + block : str + str which indicates data set valid options are + "well" + "tabfile_well" + "timeseries" + "irrdiversion" + "irrwell" + "supwell" + + Returns + ------- + dtype : (list, tuple) + """ + if block == "well": + dtype = [('k', np.int), ('i', np.int), + ('j', np.int), ('flux', np.float)] + + elif block == "tabfile_well": + dtype = [('unit', np.int), ('tabval', np.int), + ('k', np.int), ('i', np.int), ('j', np.int)] + + elif block == "time series": + dtype = [('keyword', np.object), ('id', np.int), + ('unit', np.int)] + + elif block == "irrdiversion": + dtype = [("segid", np.int), ("numcell", np.int), + ("period", np.float), ("triggerfact", np.float)] + + for i in range(maxells): + dtype += [("i{}".format(i), np.int), + ("j{}".format(i), np.int), + ("eff_fact{}".format(i), np.float), + ("field_fact{}".format(i), np.float)] + + elif block == "irrwell": + dtype = [("wellid", np.int), ("numcell", np.int), + ("period", np.float), ("triggerfact", np.float)] + + for i in range(maxells): + dtype += [("i{}".format(i), np.int), + ("j{}".format(i), np.int), + ("eff_fact{}".format(i), np.float), + ("field_fact{}".format(i), np.float)] + + elif block == "supwell": + dtype = [("wellid", np.int), ("numcell", np.int)] + + for i in range(maxells): + dtype += [("segid{}".format(i), np.int), + ("fracsup{}".format(i), np.float), + ("fracsupmax{}".format(i), np.float)] + + else: + raise NotImplementedError("block type {}, not supported" + .format(block)) + + return np.dtype(dtype) + + @staticmethod + def load(f, model, nper=0, ext_unit_dict=None): + """ + Method to load the AG package from file + + Parameters + ---------- + f : str + filename + model : gsflow.modflow.Modflow object + model to attach the ag pacakge to + nper : int + number of stress periods in model + ext_unit_dict : dict, optional + + Returns + ------- + ModflowAg object + """ + if nper == 0: + nper = model.nper + + # open the file if not already open + openfile = not hasattr(f, 'read') + if openfile: + filename = f + f = open(filename, 'r') + + # strip the file header if it exists + while True: + line = multi_line_strip(f) + if line: + break + + # read the options block + options = OptionBlock.load_options(f, ModflowAg) + + line = multi_line_strip(f) + + time_series = None + if "time series" in line: + # read time_series + t = [] + while True: + line = multi_line_strip(f) + if line == "end": + line = multi_line_strip(f) + break + + else: + t.append(line.split()) + + if len(t) > 0: + nrec = len(t) + time_series = ModflowAg.get_empty(nrec, + block="time series") + + for ix, rec in enumerate(t): + if rec[0] in ('welletall', 'wellall'): + time_series[ix] = (rec[0], -999, rec[-1]) + else: + time_series[ix] = tuple(rec[:3]) + + # read item 12-14 + if "segment list" in line: + # read item 13 + t = [] + while True: + line = multi_line_strip(f) + if line == "end": + line = multi_line_strip(f) + break + else: + t.append(line.split()) + + if len(t) > 0: + segments = [] + for rec in t: + iseg = int(rec[0]) + segments.append(iseg) + + # read item 15-17 well_list + well = None + if "well list" in line: + # read item 16 + t = [] + while True: + line = multi_line_strip(f) + if line == "end": + line = multi_line_strip(f) + break + + else: + t.append(line.split()) + + if len(t) > 0: + nrec = len(t) + + # check if this is block 16a + if isinstance(options.tabfiles, np.recarray): + tf = True + well = ModflowAg.get_empty(nrec, block='tabfile_well') + else: + tf = False + well = ModflowAg.get_empty(nrec, block="well") + + for ix, rec in enumerate(t): + if not tf: + k = int(rec[0]) - 1 + i = int(rec[1]) - 1 + j = int(rec[2]) - 1 + well[ix] = (k, i, j, rec[3]) + else: + k = int(rec[2]) - 1 + i = int(rec[3]) - 1 + j = int(rec[4]) - 1 + well[ix] = (rec[0], rec[1], k, i, j) + + maxcellsdiversion = 0 + if options.maxcellsdiversion is not None: + maxcellsdiversion = options.maxcellsdiversion + + maxcellswell = 0 + if options.maxcellswell is not None: + maxcellswell = options.maxcellswell + + maxdiversions = 0 + if options.maxdiversions is not None: + maxdiversions = options.maxdiversions + + irr_diversion = {} + irr_well = {} + sup_well = {} + # get the stress period data from blocks 18 - 29 + for per in range(nper): + while True: + if 'stress period' in line: + line = multi_line_strip(f) + + # block 18 + elif 'irrdiversion' in line: + # read block 19 + nrec = int(multi_line_strip(f).split()[0]) + if nrec == -1: + irr = np.copy(irr_diversion[ + per - 1]) + irr = irr.view(type=np.recarray) + else: + irr = ModflowAg.get_empty( + nrec, + maxells=maxcellsdiversion, + block="irrdiversion") + + # read blocks 20 & 21 + irr = _read_block_21_25_or_29(f, nrec, irr, + 21) + irr_diversion[per] = irr + line = multi_line_strip(f) + + # block 22 + elif 'irrwell' in line: + # read block 23 + nrec = int(multi_line_strip(f).split()[0]) + if nrec == -1: + irr = np.copy(irr_well[per - 1]) + irr = irr.view(type=np.recarray) + else: + irr = ModflowAg.get_empty( + nrec, + maxells=maxcellswell, + block="irrwell") + + # read blocks 24 & 25 + irr = _read_block_21_25_or_29(f, nrec, irr, 25) + + irr_well[per] = irr + line = multi_line_strip(f) + + # block 26 + elif 'supwel' in line: + # read block 27 + nrec = int(multi_line_strip(f).split()[0]) + if nrec == -1: + sup = np.copy(sup_well[per - 1]) + sup = sup.view(type=np.recarray) + + else: + sup = ModflowAg.get_empty(nrec, + maxells=maxdiversions, + block="supwell") + # read blocks 28 & 29 + sup = _read_block_21_25_or_29(f, nrec, sup, 29) + + sup_well[per] = sup + line = multi_line_strip(f) + + # block 30? + elif "end" in line: + if per == nper - 1: + break + + line = multi_line_strip(f) + break + + else: + raise ValueError( + "Something went wrong at: {}".format(line)) + + return ModflowAg(model, options=options, time_series=time_series, + well_list=well, irrwell=irr_well, + irrdiversion=irr_diversion, + supwell=sup_well, nper=nper) + + @staticmethod + def defaultunit(): + return 69 + + @staticmethod + def ftype(): + return "AG" + + @property + def plotable(self): + return False + + +def _read_block_21_25_or_29(fobj, nrec, recarray, block): + """ + Method to read blocks 21, 25, and 29 from the AG package + + Parameters + ---------- + fobj : File object + nrec : int + number of records + recarray : np.recarray + recarray to add data to + block : int + valid options are 21, 25, 29 + + Returns + ------- + recarray : np.recarray + """ + t = [] + + hrus = False + if "hru_id0" in recarray.dtype.names and \ + "segid" in recarray.dtype.names: + hrus = True + + for _ in range(nrec): + t1 = [] + ll = multi_line_strip(fobj).split() + if block in (21,): + # do not zero adjust segid + ll[0] = int(ll[0]) + else: + ll[0] = int(ll[0]) - 1 + + if block in (21, 25): + # correct list length if not using trigger factor + if len(ll) == 2: + ll += [0, 0] + elif len(ll) == 3: + ll += [0] + + t1 += ll[:4] + + elif block == 29: + t1 += ll[:2] + + else: + raise AssertionError("block number must be 21, 25, or 29") + + for _ in range(int(ll[1])): + if block == 29: + if len(ll) == 2: + ll += [1e-10] + + if hrus or block == 29: + tmp = multi_line_strip(fobj).split()[:3] + if block == 29: + tmp[0] = int(tmp[0]) + else: + tmp[0] = int(tmp[0]) - 1 + else: + tmp = multi_line_strip(fobj).split()[:4] + tmp[0:2] = [int(tmp[0]) - 1, int(tmp[1]) - 1] + + t1 += tmp + + t.append(t1) + + if len(t) > 0: + for ix, rec in enumerate(t): + for ix2, name in enumerate(recarray.dtype.names): + if ix2 >= len(rec): + pass + else: + recarray[name][ix] = rec[ix2] + return recarray diff --git a/flopy/modflow/mfuzf1.py b/flopy/modflow/mfuzf1.py index 39c76a767..4202f12c5 100644 --- a/flopy/modflow/mfuzf1.py +++ b/flopy/modflow/mfuzf1.py @@ -251,6 +251,18 @@ class ModflowUzf1(Package): removed from the unsaturated zone. EXTWC must have a value between (THTS-Sy) and THTS, where Sy is the specific yield specified in either the LPF or BCF Package. (default is 0.1) + air_entry : float, 2-D array, or dict of {kper: value} + where kper is the zero-based stress period. + Used to define the air entry pressure of the unsaturated zone in + MODFLOW-NWT simulations + hroot : float, 2-D array, or dict of {kper: value} + where kper is the zero-based stress period. + Used to define the pressure potential at roots in the unsaturated + zone in MODFLOW-NWT simulations + rootact : float, 2-D array, or dict of {kper: value} + where kper is the zero-based stress period. + Used to define the root activity in the unsaturated + zone in MODFLOW-NWT simulations uzfbud_ext : list appears to be used for sequential naming of budget output files (default is []) @@ -317,6 +329,8 @@ class ModflowUzf1(Package): OptionBlock.simple_flag), ("seepsurfk", OptionBlock.simple_flag), + ("capillaryuzet", + OptionBlock.simple_flag), ("etsquare", {OptionBlock.dtype: np.bool_, OptionBlock.nested: True, @@ -343,9 +357,10 @@ def __init__(self, model, thtr=0.15, thti=0.20, specifythtr=False, specifythti=False, nosurfleak=False, finf=1.0E-8, pet=5.0E-8, extdp=15.0, extwc=0.1, + air_entry=0.0, hroot=0.0, rootact=0.0, nwt_11_fmt=False, specifysurfk=False, rejectsurfk=False, seepsurfk=False, - etsquare=None, netflux=None, nuzgag=None, + etsquare=None, netflux=None, capillaryuzet=False, nuzgag=None, uzgag=None, extension='uzf', unitnumber=None, filenames=None, options=None, surfk=0.1): @@ -451,6 +466,7 @@ def __init__(self, model, self.specifysurfk = bool(specifysurfk) self.rejectsurfk = bool(rejectsurfk) self.seepsurfk = bool(seepsurfk) + self.capillaryuzet = bool(capillaryuzet) self.etsquare = False self.smoothfact = None if etsquare is not None: @@ -554,6 +570,15 @@ def __init__(self, model, extdp, name='extdp') self.extwc = Transient2d(model, (nrow, ncol), np.float32, extwc, name='extwc') + + if capillaryuzet and "nwt" in model.version: + self.air_entry = Transient2d(model, (nrow, ncol), np.float32, + air_entry, name="air_entry") + self.hroot = Transient2d(model, (nrow, ncol), np.float32, + hroot, name='hroot') + self.rootact = Transient2d(model, (nrow, ncol), np.float32, + rootact, name='rootact') + self.parent.add_package(self) def __setattr__(self, key, value): @@ -732,6 +757,11 @@ def write_transient(name): write_transient('extdp') if self.iuzfopt > 0: write_transient('extwc') + if self.capillaryuzet and 'nwt' in self.parent.version: + write_transient('air_entry') + write_transient('hroot') + write_transient('rootact') + f_uzf.close() @staticmethod @@ -787,6 +817,7 @@ def load(f, model, ext_unit_dict=None, check=False): specifythti = False nosurfleak = False specifysurfk = False + capillaryuzet = False etsquare = None netflux = None rejectsurfk = False @@ -814,6 +845,7 @@ def load(f, model, ext_unit_dict=None, check=False): rejectsurfk = options.rejectsurfk seepsurfk = options.seepsurfk specifysurfk = options.specifysurfk + capillaryuzet = options.capillaryuzet if options.etsquare: etsquare = options.smoothfact @@ -826,9 +858,8 @@ def load(f, model, ext_unit_dict=None, check=False): arrays = {'finf': {}, # datasets 10, 12, 14, 16 are lists of util2d arrays - 'pet': {}, - 'extdp': {}, - 'extwc': {}} + 'pet': {}, 'extdp': {}, 'extwc': {}, + 'air_entry': {}, 'hroot': {}, 'rootact': {}} def load_util2d(name, dtype, per=None): print(' loading {} array...'.format(name)) @@ -912,6 +943,28 @@ def load_util2d(name, dtype, per=None): # dataset 16 load_util2d('extwc', np.float32, per=per) + if capillaryuzet: + # dataset 17 + line = line_parse(f.readline()) + nuzf5 = pop_item(line, int) + if nuzf5 > 0: + # dataset 18 + load_util2d('air_entry', np.float32, per=per) + + # dataset 19 + line = line_parse(f.readline()) + nuzf6 = pop_item(line, int) + if nuzf6 > 0: + # dataset 20 + load_util2d('hroot', np.float32, per=per) + + # dataset21 + line = line_parse(f.readline()) + nuzf7 = pop_item(line, int) + if nuzf7 > 0: + # dataset 22 + load_util2d('rootact', np.float32, per=per) + # close the file f.close() @@ -952,6 +1005,7 @@ def load_util2d(name, dtype, per=None): netflux=netflux, seepsurfk=seepsurfk, specifysurfk=specifysurfk, rejectsurfk=rejectsurfk, + capillaryuzet=capillaryuzet, unitnumber=unitnumber, filenames=filenames, options=options, **arrays) diff --git a/flopy/utils/flopy_io.py b/flopy/utils/flopy_io.py index c7677916a..075bab7a9 100755 --- a/flopy/utils/flopy_io.py +++ b/flopy/utils/flopy_io.py @@ -66,6 +66,27 @@ def line_strip(line): return line.replace(',', ' ') +def multi_line_strip(fobj): + """ + Get next line that is not blank or is not a comment line + from a free formatted modflow input file + + Parameters + ---------- + fobj : open file object + a line of text from an input file + + Returns + ------- + str : line with comments removed and commas replaced + + """ + while True: + line = line_strip(fobj.readline()) + if line: + return line.lower() + + def get_next_line(f): """ Get the next line from a file that is not a blank line