From 09d21f347408f4d471e73534b60796c6a5f377cd Mon Sep 17 00:00:00 2001 From: Joseph Hughes Date: Tue, 17 Dec 2024 17:29:02 -0600 Subject: [PATCH 1/6] fix(csub): CSUB observations Make mf6io and code consistent. Closes #1447 --- doc/Common/gwf-csubobs.tex | 20 ++++---- doc/mf6io/mf6io.tex | 2 +- src/Model/GroundWaterFlow/gwf-csub.f90 | 66 ++++++++++++++------------ 3 files changed, 46 insertions(+), 42 deletions(-) diff --git a/doc/Common/gwf-csubobs.tex b/doc/Common/gwf-csubobs.tex index 8d718c45a8f..8cda8cd940c 100644 --- a/doc/Common/gwf-csubobs.tex +++ b/doc/Common/gwf-csubobs.tex @@ -25,20 +25,20 @@ CSUB & coarse-thickness & cellid & -- & thickness of coarse-grained materials in a GWF cell. \\ CSUB & thickness-cell & cellid & -- & total thickness of coarse-grained materials and all interbeds in a GWF cell. \\ -CSUB & theta & icsubno & -- & porosity of a interbed . \\ +CSUB & theta & icsubno or boundname & -- & porosity of a interbed or group of interbeds. \\ CSUB & coarse-theta & cellid & -- & porosity of coarse-grained materials in a GWF cell. \\ CSUB & theta-cell & cellid & -- & thickness-weighted porosity of coarse-grained materials and all interbeds in a GWF cell. \\ -CSUB & delay-flowtop & icsubno & -- & Flow between the groundwater system and a delay interbed across the top of the interbed. \\ -CSUB & delay-flowbot & icsubno & -- & Flow between the groundwater system and a delay interbed across the bottom of the interbed. \\ +CSUB & delay-flowtop & icsubno or boundname & -- & Flow between the groundwater system and a delay interbed or group of interbeds across the top of the interbed(s). \\ +CSUB & delay-flowbot & icsubno or boundname & -- & Flow between the groundwater system and a delay interbed or group of interbeds across the bottom of the interbed(s). \\ -CSUB & delay-head & icsubno & idcellno & head in interbed delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). The NODATA value is reported for steady-state stress periods. \\ -CSUB & delay-gstress & icsubno & idcellno & geostatic stress in interbed delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). The NODATA value is reported for steady-state stress periods. \\ -CSUB & delay-estress & icsubno & idcellno & effective stress in interbed delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). The NODATA value is reported for steady-state stress periods. \\ -CSUB & delay-preconstress & icsubno & idcellno & preconsolidation stress in interbed delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). The NODATA value is reported for steady-state stress periods. \\ -CSUB & delay-compaction & icsubno & idcellno & compaction in interbed delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). \\ -CSUB & delay-thickness & icsubno & idcellno & thickness of interbed delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). \\ -CSUB & delay-theta & icsubno & idcellno & porosity of interbed delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). \\ +CSUB & delay-head & icsubno or boundname & idcellno & head in interbed or group of interbeds in delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). The NODATA value is reported for steady-state stress periods. \\ +CSUB & delay-gstress & icsubno or boundname & idcellno & geostatic stress in interbed or group of interbeds in delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). The NODATA value is reported for steady-state stress periods. \\ +CSUB & delay-estress & icsubno or boundname & idcellno & effective stress in interbed or group of interbeds in delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). The NODATA value is reported for steady-state stress periods. \\ +CSUB & delay-preconstress & icsubno or boundname & idcellno & preconsolidation stress in interbed or group of interbeds in delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). The NODATA value is reported for steady-state stress periods. \\ +CSUB & delay-compaction & icsubno or boundname & idcellno & compaction in interbed or group of interbeds in delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). \\ +CSUB & delay-thickness & icsubno or boundname & idcellno & thickness of interbed or group of interbeds in delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). \\ +CSUB & delay-theta & icsubno or boundname & idcellno & porosity of interbed or group of interbeds in delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). \\ CSUB & preconstress-cell & cellid & -- & preconsolidation stress in a GWF cell containing at least one interbed. The NODATA value is reported for steady-state stress periods. diff --git a/doc/mf6io/mf6io.tex b/doc/mf6io/mf6io.tex index 2172bac78db..d3461616dd5 100644 --- a/doc/mf6io/mf6io.tex +++ b/doc/mf6io/mf6io.tex @@ -73,7 +73,7 @@ \renewcommand\labelitemi{\tiny$\bullet$} \renewcommand{\cooperator} -{the \textusgs\ Water Availability and Use Science Program} +{Water Availability and Use Science Program} \renewcommand{\reporttitle} {MODFLOW 6 -- Description of Input and Output} diff --git a/src/Model/GroundWaterFlow/gwf-csub.f90 b/src/Model/GroundWaterFlow/gwf-csub.f90 index c8aba18c1fa..bb1174e73b6 100644 --- a/src/Model/GroundWaterFlow/gwf-csub.f90 +++ b/src/Model/GroundWaterFlow/gwf-csub.f90 @@ -6790,22 +6790,22 @@ subroutine csub_df_obs(this) ! ! -- Store obs type and assign procedure pointer ! for interbed ske observation type. - call this%obs%StoreObsType('ske', .true., indx) + call this%obs%StoreObsType('ske', .false., indx) this%obs%obsData(indx)%ProcessIdPtr => csub_process_obsID ! ! -- Store obs type and assign procedure pointer ! for interbed sk observation type. - call this%obs%StoreObsType('sk', .true., indx) + call this%obs%StoreObsType('sk', .false., indx) this%obs%obsData(indx)%ProcessIdPtr => csub_process_obsID ! ! -- Store obs type and assign procedure pointer ! for ske-cell observation type. - call this%obs%StoreObsType('ske-cell', .true., indx) + call this%obs%StoreObsType('ske-cell', .false., indx) this%obs%obsData(indx)%ProcessIdPtr => csub_process_obsID ! ! -- Store obs type and assign procedure pointer ! for sk-cell observation type. - call this%obs%StoreObsType('sk-cell', .true., indx) + call this%obs%StoreObsType('sk-cell', .false., indx) this%obs%obsData(indx)%ProcessIdPtr => csub_process_obsID ! ! -- Store obs type and assign procedure pointer @@ -6820,17 +6820,17 @@ subroutine csub_df_obs(this) ! ! -- Store obs type and assign procedure pointer ! for total-compaction observation type. - call this%obs%StoreObsType('interbed-compaction', .true., indx) + call this%obs%StoreObsType('interbed-compaction', .false., indx) this%obs%obsData(indx)%ProcessIdPtr => csub_process_obsID ! ! -- Store obs type and assign procedure pointer ! for inelastic-compaction observation type. - call this%obs%StoreObsType('inelastic-compaction', .true., indx) + call this%obs%StoreObsType('inelastic-compaction', .false., indx) this%obs%obsData(indx)%ProcessIdPtr => csub_process_obsID ! ! -- Store obs type and assign procedure pointer ! for inelastic-compaction observation type. - call this%obs%StoreObsType('elastic-compaction', .true., indx) + call this%obs%StoreObsType('elastic-compaction', .false., indx) this%obs%obsData(indx)%ProcessIdPtr => csub_process_obsID ! ! -- Store obs type and assign procedure pointer @@ -6840,22 +6840,22 @@ subroutine csub_df_obs(this) ! ! -- Store obs type and assign procedure pointer ! for inelastic-compaction-cell observation type. - call this%obs%StoreObsType('inelastic-compaction-cell', .true., indx) + call this%obs%StoreObsType('inelastic-compaction-cell', .false., indx) this%obs%obsData(indx)%ProcessIdPtr => csub_process_obsID ! ! -- Store obs type and assign procedure pointer ! for elastic-compaction-cell observation type. - call this%obs%StoreObsType('elastic-compaction-cell', .true., indx) + call this%obs%StoreObsType('elastic-compaction-cell', .false., indx) this%obs%obsData(indx)%ProcessIdPtr => csub_process_obsID ! ! -- Store obs type and assign procedure pointer ! for compaction-cell observation type. - call this%obs%StoreObsType('compaction-cell', .true., indx) + call this%obs%StoreObsType('compaction-cell', .false., indx) this%obs%obsData(indx)%ProcessIdPtr => csub_process_obsID ! ! -- Store obs type and assign procedure pointer ! for interbed thickness observation type. - call this%obs%StoreObsType('thickness', .true., indx) + call this%obs%StoreObsType('thickness', .false., indx) this%obs%obsData(indx)%ProcessIdPtr => csub_process_obsID ! ! -- Store obs type and assign procedure pointer @@ -6870,7 +6870,7 @@ subroutine csub_df_obs(this) ! ! -- Store obs type and assign procedure pointer ! for interbed theta observation type. - call this%obs%StoreObsType('theta', .true., indx) + call this%obs%StoreObsType('theta', .false., indx) this%obs%obsData(indx)%ProcessIdPtr => csub_process_obsID ! ! -- Store obs type and assign procedure pointer @@ -6880,7 +6880,7 @@ subroutine csub_df_obs(this) ! ! -- Store obs type and assign procedure pointer ! for theta-cell observation type. - call this%obs%StoreObsType('theta-cell', .true., indx) + call this%obs%StoreObsType('theta-cell', .false., indx) this%obs%obsData(indx)%ProcessIdPtr => csub_process_obsID ! ! -- Store obs type and assign procedure pointer @@ -7355,20 +7355,20 @@ subroutine csub_process_obsID(obsrv, dis, inunitobs, iout) if (obsrv%ObsTypeId == 'CSUB' .or. & obsrv%ObsTypeId == 'INELASTIC-CSUB' .or. & obsrv%ObsTypeId == 'ELASTIC-CSUB' .or. & - obsrv%ObsTypeId == 'SK' .or. & - obsrv%ObsTypeId == 'SKE' .or. & - obsrv%ObsTypeId == 'THETA' .or. & - obsrv%ObsTypeId == 'THICKNESS' .or. & - obsrv%ObsTypeId == 'INTERBED-COMPACTION' .or. & - obsrv%ObsTypeId == 'INELASTIC-COMPACTION' .or. & - obsrv%ObsTypeId == 'ELASTIC-COMPACTION' .or. & - obsrv%ObsTypeId == 'DELAY-HEAD' .or. & - obsrv%ObsTypeId == 'DELAY-GSTRESS' .or. & - obsrv%ObsTypeId == 'DELAY-ESTRESS' .or. & - obsrv%ObsTypeId == 'DELAY-PRECONSTRESS' .or. & - obsrv%ObsTypeId == 'DELAY-COMPACTION' .or. & - obsrv%ObsTypeId == 'DELAY-THICKNESS' .or. & - obsrv%ObsTypeId == 'DELAY-THETA' .or. & + ! obsrv%ObsTypeId == 'SK' .or. & + ! obsrv%ObsTypeId == 'SKE' .or. & + ! obsrv%ObsTypeId == 'THETA' .or. & + ! obsrv%ObsTypeId == 'THICKNESS' .or. & + ! obsrv%ObsTypeId == 'INTERBED-COMPACTION' .or. & + ! obsrv%ObsTypeId == 'INELASTIC-COMPACTION' .or. & + ! obsrv%ObsTypeId == 'ELASTIC-COMPACTION' .or. & + ! obsrv%ObsTypeId == 'DELAY-HEAD' .or. & + ! obsrv%ObsTypeId == 'DELAY-GSTRESS' .or. & + ! obsrv%ObsTypeId == 'DELAY-ESTRESS' .or. & + ! obsrv%ObsTypeId == 'DELAY-PRECONSTRESS' .or. & + ! obsrv%ObsTypeId == 'DELAY-COMPACTION' .or. & + ! obsrv%ObsTypeId == 'DELAY-THICKNESS' .or. & + ! obsrv%ObsTypeId == 'DELAY-THETA' .or. & obsrv%ObsTypeId == 'DELAY-FLOWTOP' .or. & obsrv%ObsTypeId == 'DELAY-FLOWBOT') then call extract_idnum_or_bndname(string, icol, istart, istop, nn1, bndname) @@ -7388,16 +7388,20 @@ subroutine csub_process_obsID(obsrv, dis, inunitobs, iout) obsrv%ObsTypeId == 'DELAY-THETA') then call extract_idnum_or_bndname(string, icol, istart, istop, nn2, bndname) if (nn2 == NAMEDBOUNDFLAG) then - obsrv%FeatureName = bndname - ! -- reset nn1 - nn1 = nn2 + write (errmsg, '(3a)') & + "BOUNDNAME cannot be specified for CSUB package '", & + trim(obsrv%ObsTypeId), "' observation type." + call store_error(errmsg) + ! obsrv%FeatureName = bndname + ! ! -- reset nn1 + ! nn1 = nn2 else obsrv%NodeNumber2 = nn2 end if end if end if ! - ! -- store reach number (NodeNumber) + ! -- store observation location (NodeNumber) obsrv%NodeNumber = nn1 end subroutine csub_process_obsID From b9779088f297d03d20c22e0eb57467739193fd74 Mon Sep 17 00:00:00 2001 From: Joseph Hughes Date: Wed, 18 Dec 2024 17:27:40 -0600 Subject: [PATCH 2/6] add observation test --- autotest/test_gwf_csub_obs.py | 221 +++++++++++++++++++++++++ doc/Common/gwf-csubobs.tex | 36 ++-- doc/mf6io/gwf/csub.tex | 1 + src/Model/GroundWaterFlow/gwf-csub.f90 | 129 +++++++++------ 4 files changed, 321 insertions(+), 66 deletions(-) create mode 100644 autotest/test_gwf_csub_obs.py diff --git a/autotest/test_gwf_csub_obs.py b/autotest/test_gwf_csub_obs.py new file mode 100644 index 00000000000..9ed986a7a33 --- /dev/null +++ b/autotest/test_gwf_csub_obs.py @@ -0,0 +1,221 @@ +import os + +import flopy +import numpy as np +import pytest +from framework import TestFramework + +obs_names = [ + "delay-flowtop", "delay-flowtop", + "delay-flowbot", "delay-flowbot", + "delay-head", "delay-head", + ] +boundname = [ + False, True, + False, True, + False, True, + ] +test_fail = [ + False, False, + False, False, + False, True, + ] +cases = [f"csub_obs{idx + 1:02d}" for idx, _ in enumerate(obs_names)] + +paktest = "csub" +budtol = 1e-2 +ndcell = [19] * len(cases) + +# static model data +# spatial discretization +nlay, nrow, ncol = 1, 1, 3 +shape3d = (nlay, nrow, ncol) +size3d = nlay * nrow * ncol +delr, delc = 1.0, 1.0 +top = 0.0 +botm = [-100.0] + +# temporal discretization +nper = 1 +perlen = [1000.0 for _ in range(nper)] +nstp = [100 for _ in range(nper)] +tsmult = [1.05 for _ in range(nper)] +steady = [False for _ in range(nper)] + +strt = 0.0 +strt6 = 1.0 +hnoflo = 1e30 +hdry = -1e30 +hk = 1e6 +laytyp = [0] +S = 1e-4 +sy = 0.0 + +nouter, ninner = 1000, 300 +hclose, rclose, relax = 1e-6, 1e-6, 0.97 + +tdis_rc = [] +for i in range(nper): + tdis_rc.append((perlen[i], nstp[i], tsmult[i])) + +ib = 1 + +c = [] +c6 = [] +for j in range(0, ncol, 2): + c.append([0, 0, j, strt, strt]) + c6.append([(0, 0, j), strt]) +cd = {0: c} +cd6 = {0: c6} + +# sub data +ndb = 1 +nndb = 0 +cc = 100.0 +cr = 1.0 +void = 0.82 +theta = void / (1.0 + void) +kv = 0.025 +sgm = 0.0 +sgs = 0.0 +ini_stress = 1.0 +thick = [1.0] +sfe = cr * thick[0] +sfv = cc * thick[0] +lnd = [0] +ldnd = [0] +dp = [[kv, cr, cc]] +ss = S / (100.0 - thick[0]) + +ds15 = [0, 0, 0, 2052, 0, 0, 0, 0, 0, 0, 0, 0] +ds16 = [0, 0, 0, 100, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1] + + +def get_model(idx, ws): + name = cases[idx] + + sim = flopy.mf6.MFSimulation( + sim_name=name, version="mf6", exe_name="mf6", sim_ws=ws + ) + # create tdis package + tdis = flopy.mf6.ModflowTdis(sim, time_units="DAYS", nper=nper, perioddata=tdis_rc) + + # create iterative model solution + ims = flopy.mf6.ModflowIms( + sim, + print_option="SUMMARY", + outer_dvclose=hclose, + outer_maximum=nouter, + under_relaxation="NONE", + inner_maximum=ninner, + inner_dvclose=hclose, + rcloserecord=rclose, + linear_acceleration="CG", + scaling_method="NONE", + reordering_method="NONE", + relaxation_factor=relax, + ) + + # create gwf model + gwf = flopy.mf6.ModflowGwf(sim, modelname=name) + + dis = flopy.mf6.ModflowGwfdis( + gwf, + nlay=nlay, + nrow=nrow, + ncol=ncol, + delr=delr, + delc=delc, + top=top, + botm=botm, + filename=f"{name}.dis", + ) + + # initial conditions + ic = flopy.mf6.ModflowGwfic(gwf, strt=strt, filename=f"{name}.ic") + + # node property flow + npf = flopy.mf6.ModflowGwfnpf(gwf, save_flows=False, icelltype=laytyp, k=hk, k33=hk) + # storage + sto = flopy.mf6.ModflowGwfsto( + gwf, + save_flows=False, + iconvert=laytyp, + ss=0.0, + sy=sy, + storagecoefficient=True, + transient={0: True}, + ) + + # chd files + chd = flopy.mf6.modflow.mfgwfchd.ModflowGwfchd( + gwf, maxbound=len(c6), stress_period_data=cd6, save_flows=False + ) + + # csub files + sub6 = [ + [ + 0, + (0, 0, 1), + "delay", + ini_stress, + thick[0], + 1.0, + 230.258658761733000, + 2.302586587617330, + theta, + kv, + ini_stress, + ] + ] + bname = "interbed" + if boundname[idx]: + sub6[0].append(bname) + obs_idx = ("obs_value", obs_names[idx], bname) + else: + obs_idx = ("obs_value", obs_names[idx], (0,), (0,)) + + opth = f"{name}.csub.obs" + csub = flopy.mf6.ModflowGwfcsub( + gwf, + boundnames=boundname[idx], + head_based=False, + print_input=True, + save_flows=True, + ndelaycells=ndcell[idx], + ninterbeds=1, + beta=0.0, + cg_ske_cr=ss, + packagedata=sub6, + ) + orecarray = {} + orecarray["csub_obs.csv"] = [obs_idx] + csub_obs_package = csub.obs.initialize( + filename=opth, digits=10, print_input=True, continuous=orecarray + ) + + # output control + oc = flopy.mf6.ModflowGwfoc( + gwf, + printrecord=[("BUDGET", "ALL")], + ) + + return sim + + +def build_models(idx, test): + sim = get_model(idx, test.workspace) + + return sim, None + + +@pytest.mark.parametrize("idx, name", enumerate(cases)) +def test_mf6model(idx, name, function_tmpdir, targets): + test = TestFramework( + name=name, + workspace=function_tmpdir, + build=lambda t: build_models(idx, t), + targets=targets, + xfail=test_fail[idx], + ) + test.run() diff --git a/doc/Common/gwf-csubobs.tex b/doc/Common/gwf-csubobs.tex index 8cda8cd940c..bb3614c5218 100644 --- a/doc/Common/gwf-csubobs.tex +++ b/doc/Common/gwf-csubobs.tex @@ -5,25 +5,25 @@ CSUB & csub-cell & cellid & -- & Flow between the groundwater system for all interbeds and coarse-grained materials in a GWF cell. \\ CSUB & wcomp-csub-cell & cellid & -- & Flow between the groundwater system for all interbeds and coarse-grained materials in a GWF cell from water compressibility. \\ -CSUB & sk & icsubno or boundname & -- & Convertible interbed storativity in a interbed or group of interbeds. Convertible interbed storativity is inelastic interbed storativity if the current effective stress is greater than the preconsolidation stress. The NODATA value is reported for steady-state stress periods. \\ -CSUB & ske & icsubno or boundname & -- & Elastic interbed storativity in a interbed or group of interbeds. The NODATA value is reported for steady-state stress periods. \\ -CSUB & sk-cell & cellid & -- & Convertible interbed and coarse-grained material storativity in a GWF cell. Convertible interbed storativity is inelastic interbed storativity if the current effective stress is greater than the preconsolidation stress. The NODATA value is reported for steady-state stress periods. \\ -CSUB & ske-cell & cellid & -- & Elastic interbed and coarse-grained material storativity in a GWF cell. The NODATA value is reported for steady-state stress periods. \\ +CSUB & sk & icsubno & -- & Convertible interbed storativity in a interbed. Convertible interbed storativity is inelastic interbed storativity if the current effective stress is greater than the preconsolidation stress. \\ +CSUB & ske & icsubno & -- & Elastic interbed storativity in a interbed. \\ +CSUB & sk-cell & cellid & -- & Convertible interbed and coarse-grained material storativity in a GWF cell. Convertible interbed storativity is inelastic interbed storativity if the current effective stress is greater than the preconsolidation stress. \\ +CSUB & ske-cell & cellid & -- & Elastic interbed and coarse-grained material storativity in a GWF cell. \\ CSUB & estress-cell & cellid & -- & effective stress in a GWF cell. \\ CSUB & gstress-cell & cellid & -- & geostatic stress in a GWF cell. \\ -CSUB & interbed-compaction & icsubno or boundname & -- & interbed compaction in a interbed or group of interbeds. \\ -CSUB & inelastic-compaction & icsubno or boundname & -- & inelastic interbed compaction in a interbed or group of interbeds. \\ -CSUB & elastic-compaction & icsubno or boundname & -- & elastic interbed compaction a interbed or group of interbeds. \\ +CSUB & interbed-compaction & icsubno & -- & interbed compaction in a interbed. \\ +CSUB & inelastic-compaction & icsubno & -- & inelastic interbed compaction in a interbed. \\ +CSUB & elastic-compaction & icsubno & -- & elastic interbed compaction a interbed. \\ CSUB & coarse-compaction & cellid & -- & elastic compaction in coarse-grained materials in a GWF cell. \\ CSUB & inelastic-compaction-cell & cellid & -- & inelastic compaction in all interbeds in a GWF cell. \\ CSUB & elastic-compaction-cell & cellid & -- & elastic compaction in coarse-grained materials and all interbeds in a GWF cell. \\ CSUB & compaction-cell & cellid & -- & total compaction in coarse-grained materials and all interbeds in a GWF cell. \\ -CSUB & thickness & icsubno or boundname & -- & thickness of a interbed or group of interbeds. \\ -CSUB & coarse-thickness & cellid & -- & thickness of coarse-grained materials in a GWF cell. \\ -CSUB & thickness-cell & cellid & -- & total thickness of coarse-grained materials and all interbeds in a GWF cell. \\ +CSUB & thickness & icsubno & -- & thickness of a interbed. \\ +CSUB & coarse-thickness & cellid & -- & thickness of coarse-grained materials in a GWF cell. \\ +CSUB & thickness-cell & cellid & -- & total thickness of coarse-grained materials and all interbeds in a GWF cell. \\ CSUB & theta & icsubno or boundname & -- & porosity of a interbed or group of interbeds. \\ CSUB & coarse-theta & cellid & -- & porosity of coarse-grained materials in a GWF cell. \\ @@ -32,13 +32,13 @@ CSUB & delay-flowtop & icsubno or boundname & -- & Flow between the groundwater system and a delay interbed or group of interbeds across the top of the interbed(s). \\ CSUB & delay-flowbot & icsubno or boundname & -- & Flow between the groundwater system and a delay interbed or group of interbeds across the bottom of the interbed(s). \\ -CSUB & delay-head & icsubno or boundname & idcellno & head in interbed or group of interbeds in delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). The NODATA value is reported for steady-state stress periods. \\ -CSUB & delay-gstress & icsubno or boundname & idcellno & geostatic stress in interbed or group of interbeds in delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). The NODATA value is reported for steady-state stress periods. \\ -CSUB & delay-estress & icsubno or boundname & idcellno & effective stress in interbed or group of interbeds in delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). The NODATA value is reported for steady-state stress periods. \\ -CSUB & delay-preconstress & icsubno or boundname & idcellno & preconsolidation stress in interbed or group of interbeds in delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). The NODATA value is reported for steady-state stress periods. \\ -CSUB & delay-compaction & icsubno or boundname & idcellno & compaction in interbed or group of interbeds in delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). \\ -CSUB & delay-thickness & icsubno or boundname & idcellno & thickness of interbed or group of interbeds in delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). \\ -CSUB & delay-theta & icsubno or boundname & idcellno & porosity of interbed or group of interbeds in delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). \\ +CSUB & delay-head & icsubno & idcellno & head in interbed in delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). \\ +CSUB & delay-gstress & icsubno & idcellno & geostatic stress in interbed in delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). \\ +CSUB & delay-estress & icsubno & idcellno & effective stress in interbed in delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). \\ +CSUB & delay-preconstress & icsubno & idcellno & preconsolidation stress in interbed in delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). \\ +CSUB & delay-compaction & icsubno & idcellno & compaction in interbed in delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). \\ +CSUB & delay-thickness & icsubno & idcellno & thickness of interbed or group of interbeds in delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). \\ +CSUB & delay-theta & icsubno & idcellno & porosity of interbed in delay cell idcellno (1 $<=$ idcellno $<=$ NDELAYCELLS). \\ -CSUB & preconstress-cell & cellid & -- & preconsolidation stress in a GWF cell containing at least one interbed. The NODATA value is reported for steady-state stress periods. +CSUB & preconstress-cell & cellid & -- & preconsolidation stress in a GWF cell containing at least one interbed. diff --git a/doc/mf6io/gwf/csub.tex b/doc/mf6io/gwf/csub.tex index 65ec0558246..e42d4fc1d4f 100644 --- a/doc/mf6io/gwf/csub.tex +++ b/doc/mf6io/gwf/csub.tex @@ -49,6 +49,7 @@ \subsubsection{Available observation types} \endhead \hline +\multicolumn{5}{l}{\textbf{NOTE}: The NODATA value is reported for steady-state stress periods.} \\ \endfoot \input{../Common/gwf-csubobs.tex} diff --git a/src/Model/GroundWaterFlow/gwf-csub.f90 b/src/Model/GroundWaterFlow/gwf-csub.f90 index bb1174e73b6..4c19c64d58f 100644 --- a/src/Model/GroundWaterFlow/gwf-csub.f90 +++ b/src/Model/GroundWaterFlow/gwf-csub.f90 @@ -6790,22 +6790,22 @@ subroutine csub_df_obs(this) ! ! -- Store obs type and assign procedure pointer ! for interbed ske observation type. - call this%obs%StoreObsType('ske', .false., indx) + call this%obs%StoreObsType('ske', .true., indx) this%obs%obsData(indx)%ProcessIdPtr => csub_process_obsID ! ! -- Store obs type and assign procedure pointer ! for interbed sk observation type. - call this%obs%StoreObsType('sk', .false., indx) + call this%obs%StoreObsType('sk', .true., indx) this%obs%obsData(indx)%ProcessIdPtr => csub_process_obsID ! ! -- Store obs type and assign procedure pointer ! for ske-cell observation type. - call this%obs%StoreObsType('ske-cell', .false., indx) + call this%obs%StoreObsType('ske-cell', .true., indx) this%obs%obsData(indx)%ProcessIdPtr => csub_process_obsID ! ! -- Store obs type and assign procedure pointer ! for sk-cell observation type. - call this%obs%StoreObsType('sk-cell', .false., indx) + call this%obs%StoreObsType('sk-cell', .true., indx) this%obs%obsData(indx)%ProcessIdPtr => csub_process_obsID ! ! -- Store obs type and assign procedure pointer @@ -6820,17 +6820,17 @@ subroutine csub_df_obs(this) ! ! -- Store obs type and assign procedure pointer ! for total-compaction observation type. - call this%obs%StoreObsType('interbed-compaction', .false., indx) + call this%obs%StoreObsType('interbed-compaction', .true., indx) this%obs%obsData(indx)%ProcessIdPtr => csub_process_obsID ! ! -- Store obs type and assign procedure pointer ! for inelastic-compaction observation type. - call this%obs%StoreObsType('inelastic-compaction', .false., indx) + call this%obs%StoreObsType('inelastic-compaction', .true., indx) this%obs%obsData(indx)%ProcessIdPtr => csub_process_obsID ! ! -- Store obs type and assign procedure pointer ! for inelastic-compaction observation type. - call this%obs%StoreObsType('elastic-compaction', .false., indx) + call this%obs%StoreObsType('elastic-compaction', .true., indx) this%obs%obsData(indx)%ProcessIdPtr => csub_process_obsID ! ! -- Store obs type and assign procedure pointer @@ -6840,22 +6840,22 @@ subroutine csub_df_obs(this) ! ! -- Store obs type and assign procedure pointer ! for inelastic-compaction-cell observation type. - call this%obs%StoreObsType('inelastic-compaction-cell', .false., indx) + call this%obs%StoreObsType('inelastic-compaction-cell', .true., indx) this%obs%obsData(indx)%ProcessIdPtr => csub_process_obsID ! ! -- Store obs type and assign procedure pointer ! for elastic-compaction-cell observation type. - call this%obs%StoreObsType('elastic-compaction-cell', .false., indx) + call this%obs%StoreObsType('elastic-compaction-cell', .true., indx) this%obs%obsData(indx)%ProcessIdPtr => csub_process_obsID ! ! -- Store obs type and assign procedure pointer ! for compaction-cell observation type. - call this%obs%StoreObsType('compaction-cell', .false., indx) + call this%obs%StoreObsType('compaction-cell', .true., indx) this%obs%obsData(indx)%ProcessIdPtr => csub_process_obsID ! ! -- Store obs type and assign procedure pointer ! for interbed thickness observation type. - call this%obs%StoreObsType('thickness', .false., indx) + call this%obs%StoreObsType('thickness', .true., indx) this%obs%obsData(indx)%ProcessIdPtr => csub_process_obsID ! ! -- Store obs type and assign procedure pointer @@ -6870,7 +6870,7 @@ subroutine csub_df_obs(this) ! ! -- Store obs type and assign procedure pointer ! for interbed theta observation type. - call this%obs%StoreObsType('theta', .false., indx) + call this%obs%StoreObsType('theta', .true., indx) this%obs%obsData(indx)%ProcessIdPtr => csub_process_obsID ! ! -- Store obs type and assign procedure pointer @@ -6880,7 +6880,7 @@ subroutine csub_df_obs(this) ! ! -- Store obs type and assign procedure pointer ! for theta-cell observation type. - call this%obs%StoreObsType('theta-cell', .false., indx) + call this%obs%StoreObsType('theta-cell', .true., indx) this%obs%obsData(indx)%ProcessIdPtr => csub_process_obsID ! ! -- Store obs type and assign procedure pointer @@ -7355,53 +7355,86 @@ subroutine csub_process_obsID(obsrv, dis, inunitobs, iout) if (obsrv%ObsTypeId == 'CSUB' .or. & obsrv%ObsTypeId == 'INELASTIC-CSUB' .or. & obsrv%ObsTypeId == 'ELASTIC-CSUB' .or. & - ! obsrv%ObsTypeId == 'SK' .or. & - ! obsrv%ObsTypeId == 'SKE' .or. & - ! obsrv%ObsTypeId == 'THETA' .or. & - ! obsrv%ObsTypeId == 'THICKNESS' .or. & - ! obsrv%ObsTypeId == 'INTERBED-COMPACTION' .or. & - ! obsrv%ObsTypeId == 'INELASTIC-COMPACTION' .or. & - ! obsrv%ObsTypeId == 'ELASTIC-COMPACTION' .or. & - ! obsrv%ObsTypeId == 'DELAY-HEAD' .or. & - ! obsrv%ObsTypeId == 'DELAY-GSTRESS' .or. & - ! obsrv%ObsTypeId == 'DELAY-ESTRESS' .or. & - ! obsrv%ObsTypeId == 'DELAY-PRECONSTRESS' .or. & - ! obsrv%ObsTypeId == 'DELAY-COMPACTION' .or. & - ! obsrv%ObsTypeId == 'DELAY-THICKNESS' .or. & - ! obsrv%ObsTypeId == 'DELAY-THETA' .or. & + obsrv%ObsTypeId == 'SK' .or. & + obsrv%ObsTypeId == 'SKE' .or. & + obsrv%ObsTypeId == 'THETA' .or. & + obsrv%ObsTypeId == 'THICKNESS' .or. & + obsrv%ObsTypeId == 'INTERBED-COMPACTION' .or. & + obsrv%ObsTypeId == 'INELASTIC-COMPACTION' .or. & + obsrv%ObsTypeId == 'ELASTIC-COMPACTION' .or. & + obsrv%ObsTypeId == 'DELAY-HEAD' .or. & + obsrv%ObsTypeId == 'DELAY-GSTRESS' .or. & + obsrv%ObsTypeId == 'DELAY-ESTRESS' .or. & + obsrv%ObsTypeId == 'DELAY-PRECONSTRESS' .or. & + obsrv%ObsTypeId == 'DELAY-COMPACTION' .or. & + obsrv%ObsTypeId == 'DELAY-THICKNESS' .or. & + obsrv%ObsTypeId == 'DELAY-THETA' .or. & obsrv%ObsTypeId == 'DELAY-FLOWTOP' .or. & obsrv%ObsTypeId == 'DELAY-FLOWBOT') then call extract_idnum_or_bndname(string, icol, istart, istop, nn1, bndname) + ! read cellid else nn1 = dis%noder_from_string(icol, istart, istop, inunitobs, & iout, string, flag_string) end if - if (nn1 == NAMEDBOUNDFLAG) then - obsrv%FeatureName = bndname - else - if (obsrv%ObsTypeId == 'DELAY-HEAD' .or. & - obsrv%ObsTypeId == 'DELAY-GSTRESS' .or. & - obsrv%ObsTypeId == 'DELAY-ESTRESS' .or. & - obsrv%ObsTypeId == 'DELAY-PRECONSTRESS' .or. & - obsrv%ObsTypeId == 'DELAY-COMPACTION' .or. & - obsrv%ObsTypeId == 'DELAY-THICKNESS' .or. & - obsrv%ObsTypeId == 'DELAY-THETA') then - call extract_idnum_or_bndname(string, icol, istart, istop, nn2, bndname) - if (nn2 == NAMEDBOUNDFLAG) then - write (errmsg, '(3a)') & - "BOUNDNAME cannot be specified for CSUB package '", & - trim(obsrv%ObsTypeId), "' observation type." + ! boundnames are not allowed for these observation types + if (obsrv%ObsTypeId == 'SK' .or. & + obsrv%ObsTypeId == 'SKE' .or. & + obsrv%ObsTypeId == 'THETA' .or. & + obsrv%ObsTypeId == 'THICKNESS' .or. & + obsrv%ObsTypeId == 'DELAY-HEAD' .or. & + obsrv%ObsTypeId == 'DELAY-GSTRESS' .or. & + obsrv%ObsTypeId == 'DELAY-ESTRESS' .or. & + obsrv%ObsTypeId == 'DELAY-PRECONSTRESS' .or. & + obsrv%ObsTypeId == 'DELAY-COMPACTION' .or. & + obsrv%ObsTypeId == 'DELAY-THICKNESS' .or. & + obsrv%ObsTypeId == 'DELAY-THETA') then + if (nn1 == NAMEDBOUNDFLAG) then + write (errmsg, '(5a)') & + "BOUNDNAME ('", trim(adjustl(bndname)), & + "') not allowed for CSUB observation type '", & + trim(adjustl(obsrv%ObsTypeId)), "'." call store_error(errmsg) - ! obsrv%FeatureName = bndname - ! ! -- reset nn1 - ! nn1 = nn2 - else - obsrv%NodeNumber2 = nn2 + end if + ! boundnames are allowed for these observation types + else if (obsrv%ObsTypeId == 'CSUB' .or. & + obsrv%ObsTypeId == 'INELASTIC-CSUB' .or. & + obsrv%ObsTypeId == 'ELASTIC-CSUB' .or. & + ! obsrv%ObsTypeId == 'THICKNESS' .or. & + obsrv%ObsTypeId == 'INTERBED-COMPACTION' .or. & + obsrv%ObsTypeId == 'INELASTIC-COMPACTION' .or. & + obsrv%ObsTypeId == 'ELASTIC-COMPACTION' .or. & + obsrv%ObsTypeId == 'DELAY-FLOWTOP' .or. & + obsrv%ObsTypeId == 'DELAY-FLOWBOT') then + if (nn1 == NAMEDBOUNDFLAG) then + obsrv%FeatureName = bndname + else + if (obsrv%ObsTypeId == 'DELAY-HEAD' .or. & + obsrv%ObsTypeId == 'DELAY-GSTRESS' .or. & + obsrv%ObsTypeId == 'DELAY-ESTRESS' .or. & + obsrv%ObsTypeId == 'DELAY-PRECONSTRESS' .or. & + obsrv%ObsTypeId == 'DELAY-COMPACTION' .or. & + obsrv%ObsTypeId == 'DELAY-THICKNESS' .or. & + obsrv%ObsTypeId == 'DELAY-THETA') then + call extract_idnum_or_bndname(string, icol, istart, istop, nn2, bndname) + if (nn2 == NAMEDBOUNDFLAG) then + write (errmsg, '(5a)') & + "BOUNDNAME ('", trim(adjustl(bndname)), & + "') not allowed for CSUB observation type '", & + trim(adjustl(obsrv%ObsTypeId)), "' idcellno." + call store_error(errmsg) + ! obsrv%FeatureName = bndname + ! ! -- reset nn1 + ! nn1 = nn2 + else + obsrv%NodeNumber2 = nn2 + end if end if end if end if + ! - ! -- store observation location (NodeNumber) + ! -- store reach number (NodeNumber) obsrv%NodeNumber = nn1 end subroutine csub_process_obsID From a2a1cb90f83ca65dc55614fcf8760864c89e94e6 Mon Sep 17 00:00:00 2001 From: Joseph Hughes Date: Thu, 19 Dec 2024 13:48:55 -0600 Subject: [PATCH 3/6] Update csub autotests to be consistent with redefined observations options --- autotest/test_gwf_csub_obs.py | 39 ++++++++++++-- autotest/test_gwf_csub_sub03.py | 6 +-- autotest/test_gwf_csub_subwt01.py | 2 +- autotest/test_gwf_csub_subwt02.py | 18 +++---- autotest/test_gwf_csub_zdisp01.py | 8 +-- doc/Common/gwf-csubobs.tex | 2 +- src/Model/GroundWaterFlow/gwf-csub.f90 | 73 ++++++++++++++------------ 7 files changed, 92 insertions(+), 56 deletions(-) diff --git a/autotest/test_gwf_csub_obs.py b/autotest/test_gwf_csub_obs.py index 9ed986a7a33..c2d0014dfe7 100644 --- a/autotest/test_gwf_csub_obs.py +++ b/autotest/test_gwf_csub_obs.py @@ -1,7 +1,4 @@ -import os - import flopy -import numpy as np import pytest from framework import TestFramework @@ -9,8 +6,32 @@ "delay-flowtop", "delay-flowtop", "delay-flowbot", "delay-flowbot", "delay-head", "delay-head", + "delay-gstress", "delay-gstress", + "delay-estress", "delay-estress", + "delay-preconstress", "delay-preconstress", + "delay-compaction", "delay-compaction", + "delay-thickness", "delay-thickness", + "delay-theta", "delay-theta", + "csub", "csub", + "inelastic-csub", "inelastic-csub", + "elastic-csub", "elastic-csub", + "interbed-compaction", "interbed-compaction", + "inelastic-compaction", "inelastic-compaction", + "elastic-compaction", "elastic-compaction", ] boundname = [ + False, True, + False, True, + False, True, + False, True, + False, True, + False, True, + False, True, + False, True, + False, True, + False, True, + False, True, + False, True, False, True, False, True, False, True, @@ -19,6 +40,18 @@ False, False, False, False, False, True, + False, True, + False, True, + False, True, + False, True, + False, True, + False, True, + False, False, + False, False, + False, False, + False, True, + False, True, + False, True, ] cases = [f"csub_obs{idx + 1:02d}" for idx, _ in enumerate(obs_names)] diff --git a/autotest/test_gwf_csub_sub03.py b/autotest/test_gwf_csub_sub03.py index 4ef5c0ba7de..141f27bcf8c 100644 --- a/autotest/test_gwf_csub_sub03.py +++ b/autotest/test_gwf_csub_sub03.py @@ -318,9 +318,9 @@ def get_model(idx, ws): ) orecarray = {} orecarray["csub_obs.csv"] = [ - ("tcomp1", "interbed-compaction", "01_05_05"), - ("tcomp2", "interbed-compaction", "02_05_05"), - ("tcomp3", "interbed-compaction", "03_05_05"), + ("tcomp1", "interbed-compaction", (44,)), + ("tcomp2", "interbed-compaction", (140,)), + ("tcomp3", "interbed-compaction", (240,)), ] csub_obs_package = csub.obs.initialize( filename=opth, digits=10, print_input=True, continuous=orecarray diff --git a/autotest/test_gwf_csub_subwt01.py b/autotest/test_gwf_csub_subwt01.py index 3815ecbc08f..e14824bd0c3 100644 --- a/autotest/test_gwf_csub_subwt01.py +++ b/autotest/test_gwf_csub_subwt01.py @@ -212,7 +212,7 @@ def get_model(idx, ws): ) orecarray = {} orecarray["csub_obs.csv"] = [ - ("w1l1", "interbed-compaction", "01_01_02"), + ("w1l1", "compaction-cell", (0, 0, 1)), ("w1l1t", "csub-cell", (0, 0, 1)), ] csub_obs_package = csub.obs.initialize( diff --git a/autotest/test_gwf_csub_subwt02.py b/autotest/test_gwf_csub_subwt02.py index 2cab25980bd..26f8656ec66 100644 --- a/autotest/test_gwf_csub_subwt02.py +++ b/autotest/test_gwf_csub_subwt02.py @@ -344,14 +344,14 @@ def get_model(idx, ws): ) cobs = [ - ("w1l1", "interbed-compaction", "01_09_10"), - ("w1l2", "interbed-compaction", "02_09_10"), - ("w1l3", "interbed-compaction", "03_09_10"), - ("w1l4", "interbed-compaction", "04_09_10"), - ("w2l1", "interbed-compaction", "01_12_07"), - ("w2l2", "interbed-compaction", "02_12_07"), - ("w2l3", "interbed-compaction", "03_12_07"), - ("w2l4", "interbed-compaction", "04_12_07"), + ("w1l1", "interbed-compaction", (89,)), + ("w1l2", "interbed-compaction", (299,)), + ("w1l3", "interbed-compaction", (509,)), + ("w1l4", "interbed-compaction", (719,)), + ("w2l1", "interbed-compaction", (130,)), + ("w2l2", "interbed-compaction", (340,)), + ("w2l3", "interbed-compaction", (550,)), + ("w2l4", "interbed-compaction",(760,)), ("s1l1", "coarse-compaction", (0, 8, 9)), ("s1l2", "coarse-compaction", (1, 8, 9)), ("s1l3", "coarse-compaction", (2, 8, 9)), @@ -383,7 +383,7 @@ def get_model(idx, ws): ("pc4", "preconstress-cell", (3, 8, 9)), ("sk1l2", "ske-cell", (1, 8, 9)), ("sk2l4", "ske-cell", (3, 11, 6)), - ("t1l2", "theta", "02_09_10"), + ("t1l2", "theta", (1, 8, 9)), ] orecarray = {"csub_obs.csv": cobs} diff --git a/autotest/test_gwf_csub_zdisp01.py b/autotest/test_gwf_csub_zdisp01.py index 050e55aba89..9ca531120ba 100644 --- a/autotest/test_gwf_csub_zdisp01.py +++ b/autotest/test_gwf_csub_zdisp01.py @@ -283,13 +283,13 @@ def build_models(idx, test): packagedata=sub6, ) orecarray = {} - tag = f"{3:02d}_{wrp[0] + 1:02d}_{wcp[0] + 1:02d}" oloc = (2, wrp[0], wcp[0]) + ibloc = (449,) orecarray["csub_obs.csv"] = [ - ("tcomp3", "interbed-compaction", tag), + ("tcomp3", "interbed-compaction", ibloc), ("sk-tcomp3", "coarse-compaction", oloc), - ("ibi-tcomp3", "inelastic-compaction", tag), - ("ibe-tcomp3", "elastic-compaction", tag), + ("ibi-tcomp3", "inelastic-compaction", ibloc), + ("ibe-tcomp3", "elastic-compaction", ibloc), ] csub_obs_package = csub.obs.initialize( filename=opth, digits=10, print_input=True, continuous=orecarray diff --git a/doc/Common/gwf-csubobs.tex b/doc/Common/gwf-csubobs.tex index bb3614c5218..7c7fa18bca7 100644 --- a/doc/Common/gwf-csubobs.tex +++ b/doc/Common/gwf-csubobs.tex @@ -25,7 +25,7 @@ CSUB & coarse-thickness & cellid & -- & thickness of coarse-grained materials in a GWF cell. \\ CSUB & thickness-cell & cellid & -- & total thickness of coarse-grained materials and all interbeds in a GWF cell. \\ -CSUB & theta & icsubno or boundname & -- & porosity of a interbed or group of interbeds. \\ +CSUB & theta & icsubno & -- & porosity of a interbed. \\ CSUB & coarse-theta & cellid & -- & porosity of coarse-grained materials in a GWF cell. \\ CSUB & theta-cell & cellid & -- & thickness-weighted porosity of coarse-grained materials and all interbeds in a GWF cell. \\ diff --git a/src/Model/GroundWaterFlow/gwf-csub.f90 b/src/Model/GroundWaterFlow/gwf-csub.f90 index 4c19c64d58f..0f614473a1b 100644 --- a/src/Model/GroundWaterFlow/gwf-csub.f90 +++ b/src/Model/GroundWaterFlow/gwf-csub.f90 @@ -7341,10 +7341,18 @@ subroutine csub_process_obsID(obsrv, dis, inunitobs, iout) character(len=LINELENGTH) :: string character(len=LENBOUNDNAME) :: bndname logical(LGP) :: flag_string + logical(LGP) :: flag_idcellno + logical(LGP) :: flag_error ! ! -- initialize variables string = obsrv%IDstring flag_string = .TRUE. + flag_idcellno = .FALSE. + flag_error = .FALSE. + if (obsrv%ObsTypeId(1:5) == "DELAY" .AND. & + obsrv%ObsTypeId(1:10) /= "DELAY-FLOW") then + flag_idcellno = .TRUE. + end if ! ! -- Extract reach number from string and store it. ! If 1st item is not an integer(I4B), it should be a @@ -7372,7 +7380,7 @@ subroutine csub_process_obsID(obsrv, dis, inunitobs, iout) obsrv%ObsTypeId == 'DELAY-FLOWTOP' .or. & obsrv%ObsTypeId == 'DELAY-FLOWBOT') then call extract_idnum_or_bndname(string, icol, istart, istop, nn1, bndname) - ! read cellid + ! read cellid else nn1 = dis%noder_from_string(icol, istart, istop, inunitobs, & iout, string, flag_string) @@ -7382,6 +7390,9 @@ subroutine csub_process_obsID(obsrv, dis, inunitobs, iout) obsrv%ObsTypeId == 'SKE' .or. & obsrv%ObsTypeId == 'THETA' .or. & obsrv%ObsTypeId == 'THICKNESS' .or. & + obsrv%ObsTypeId == 'INTERBED-COMPACTION' .or. & + obsrv%ObsTypeId == 'INELASTIC-COMPACTION' .or. & + obsrv%ObsTypeId == 'ELASTIC-COMPACTION' .or. & obsrv%ObsTypeId == 'DELAY-HEAD' .or. & obsrv%ObsTypeId == 'DELAY-GSTRESS' .or. & obsrv%ObsTypeId == 'DELAY-ESTRESS' .or. & @@ -7389,50 +7400,42 @@ subroutine csub_process_obsID(obsrv, dis, inunitobs, iout) obsrv%ObsTypeId == 'DELAY-COMPACTION' .or. & obsrv%ObsTypeId == 'DELAY-THICKNESS' .or. & obsrv%ObsTypeId == 'DELAY-THETA') then - if (nn1 == NAMEDBOUNDFLAG) then - write (errmsg, '(5a)') & - "BOUNDNAME ('", trim(adjustl(bndname)), & - "') not allowed for CSUB observation type '", & - trim(adjustl(obsrv%ObsTypeId)), "'." - call store_error(errmsg) - end if - ! boundnames are allowed for these observation types + if (nn1 == NAMEDBOUNDFLAG) then + write (errmsg, '(5a)') & + "BOUNDNAME ('", trim(adjustl(bndname)), & + "') not allowed for CSUB observation type '", & + trim(adjustl(obsrv%ObsTypeId)), "'." + call store_error(errmsg) + flag_error = .TRUE. + end if + ! boundnames are allowed for these observation types else if (obsrv%ObsTypeId == 'CSUB' .or. & obsrv%ObsTypeId == 'INELASTIC-CSUB' .or. & obsrv%ObsTypeId == 'ELASTIC-CSUB' .or. & - ! obsrv%ObsTypeId == 'THICKNESS' .or. & - obsrv%ObsTypeId == 'INTERBED-COMPACTION' .or. & - obsrv%ObsTypeId == 'INELASTIC-COMPACTION' .or. & - obsrv%ObsTypeId == 'ELASTIC-COMPACTION' .or. & + ! obsrv%ObsTypeId == 'INTERBED-COMPACTION' .or. & + ! obsrv%ObsTypeId == 'INELASTIC-COMPACTION' .or. & + ! obsrv%ObsTypeId == 'ELASTIC-COMPACTION' .or. & obsrv%ObsTypeId == 'DELAY-FLOWTOP' .or. & obsrv%ObsTypeId == 'DELAY-FLOWBOT') then if (nn1 == NAMEDBOUNDFLAG) then obsrv%FeatureName = bndname - else - if (obsrv%ObsTypeId == 'DELAY-HEAD' .or. & - obsrv%ObsTypeId == 'DELAY-GSTRESS' .or. & - obsrv%ObsTypeId == 'DELAY-ESTRESS' .or. & - obsrv%ObsTypeId == 'DELAY-PRECONSTRESS' .or. & - obsrv%ObsTypeId == 'DELAY-COMPACTION' .or. & - obsrv%ObsTypeId == 'DELAY-THICKNESS' .or. & - obsrv%ObsTypeId == 'DELAY-THETA') then - call extract_idnum_or_bndname(string, icol, istart, istop, nn2, bndname) - if (nn2 == NAMEDBOUNDFLAG) then - write (errmsg, '(5a)') & - "BOUNDNAME ('", trim(adjustl(bndname)), & - "') not allowed for CSUB observation type '", & - trim(adjustl(obsrv%ObsTypeId)), "' idcellno." - call store_error(errmsg) - ! obsrv%FeatureName = bndname - ! ! -- reset nn1 - ! nn1 = nn2 - else - obsrv%NodeNumber2 = nn2 - end if + end if + end if + ! read idcellno for delay observations + if (flag_idcellno .EQV. .TRUE. .AND. flag_error .EQV. .FALSE.) then + if (nn1 /= NAMEDBOUNDFLAG) then + call extract_idnum_or_bndname(string, icol, istart, istop, nn2, bndname) + if (nn2 == NAMEDBOUNDFLAG) then + write (errmsg, '(5a)') & + "BOUNDNAME ('", trim(adjustl(bndname)), & + "') not allowed for CSUB observation type '", & + trim(adjustl(obsrv%ObsTypeId)), "' idcellno." + call store_error(errmsg) + else + obsrv%NodeNumber2 = nn2 end if end if end if - ! ! -- store reach number (NodeNumber) obsrv%NodeNumber = nn1 From 22c8aa40c3e0f3209b16e9be2f292a027e9688f0 Mon Sep 17 00:00:00 2001 From: Joseph Hughes Date: Thu, 19 Dec 2024 14:21:31 -0600 Subject: [PATCH 4/6] update release notes --- doc/ReleaseNotes/ReleaseNotes.tex | 2 +- doc/ReleaseNotes/develop.tex | 147 +++++++++++------- .../mf6ivar/examples/gwf-csub-example-obs.dat | 6 +- 3 files changed, 96 insertions(+), 59 deletions(-) diff --git a/doc/ReleaseNotes/ReleaseNotes.tex b/doc/ReleaseNotes/ReleaseNotes.tex index ba2f1fdd0df..0b5d22e48ad 100644 --- a/doc/ReleaseNotes/ReleaseNotes.tex +++ b/doc/ReleaseNotes/ReleaseNotes.tex @@ -49,7 +49,7 @@ \renewcommand{\cooperator} -{the \textusgs\ Water Availability and Use Science Program} +{Water Availability and Use Science Program} \renewcommand{\reporttitle} {MODFLOW~6 Release Notes} \renewcommand{\coverphoto}{coverimage.jpg} diff --git a/doc/ReleaseNotes/develop.tex b/doc/ReleaseNotes/develop.tex index 91ed05a9de9..188b500f734 100644 --- a/doc/ReleaseNotes/develop.tex +++ b/doc/ReleaseNotes/develop.tex @@ -1,67 +1,102 @@ -% Use this template for starting initializing the release notes -% after a release has just been made. +% Use this template for starting initializing the release notes after a release +% has just been made. -\item \currentmodflowversion + \item \currentmodflowversion -%\underline{NEW FUNCTIONALITY} -%\begin{itemize} -% \item xxx -% \item xxx -% \item xxx -%\end{itemize} + \underline{NEW FUNCTIONALITY} + \begin{itemize} + \item With this release, there are now two supported executables for MODFLOW 6. The standard executable has no external dependencies and is straightforward to install and use on common operating systems. The extended executable for MODFLOW, which is called Extended MODFLOW, has additional capabilities beyond the standard executable. These additional capabilities presently include parallel computing and support for NetCDF input and output files. Extended MODFLOW relies on third-party libraries, which must be available for the software to run properly. The MODFLOW 6---Description of Input and Output includes a new section on Extended MODFLOW. This input and output guide was also revised to clearly mark in red those input variables that only work with Extended MODFLOW. + \item A new adaptive time stepping (ATS) capability was added to the Advection (ADV) Package of the Groundwater Transport (GWT) Model. A new input option, called ATS\_PERCEL, specifies the fractional cell distance that a particle of water can travel within one time step. When ATS\_PERCEL is specified by the user, and the ATS utility is activated in the TDIS Package, the ADV Package will calculate the largest time step that will meet this fractional cell distance constraint, and will submit this time step to the ATS utility. This option may improve time stepping for solute transport models and for variable-density flow and transport models by allowing step lengths to be calculated as a function of the flow system rather than being specified as input by the user. + \item Added the capability to write sorbate concentrations to binary output files. A new SORBATE option is now available in the Mobile Storage and Transfer (MST) Package and the Immobile Storage and Transfer (IST) Package of the GWT Model to provide the name of the binary output file for sorbate concentrations. Sorbate concentrations will be written to the binary output file whenever concentrations for the GWT model are saved, as determined by the GWT Output Control option. + \item Added kinematic-wave routing option for the Streamflow Routing (SFR) Package. Prior to this change, the SFR Package could only simulate unidirectional, steady, uniform flow. With kinematic-wave routing, unidirectional waves can now propagate through the SFR network by explicitly including a storage term in the reach continuity equation. The kinematic-wave routing option is based on the ``TRANSROUTE'' option available in the SFR Package in MODFLOW-NWT. The kinematic-wave routing option is enabled by specifying ``STORAGE'' in the SFR Package OPTIONS block. + \item The Freundlich and Langmuir isotherms can now be used to represent sorption in the immobile domain when simulating solute transport using the Groundwater Transport (GWT) Model. Prior to this change, only linear sorption could be used with the Immobile Storage and Transfer (IST) Package for the GWT Model. With this change, the SORPTION keyword specified in the OPTIONS block of the IST Package must be followed by LINEAR, FREUNDLICH, or LANGMUIR. If the FREUNDLICH or LANGMUIR isotherms are specified, then the user must also include the SP2 array in the GRIDDATA block of the IST Package. This change breaks backward compatibility for GWT Models that used the SORPTION option in the IST Package, which previously did not require the type of sorption to be specified after the SORPTION keyword. Details on the implementation of the nonlinear Freundlich and Langmuir sorption isotherms are described in a new chapter in the MODFLOW 6 --- Supplemental Technical Information guide, which is included with the MODFLOW 6 distribution. + \end{itemize} -%\underline{EXAMPLES} -%\begin{itemize} -% \item xxx -% \item xxx -% \item xxx -%\end{itemize} + \underline{EXAMPLES} + \begin{itemize} + \item A new Toth example was added to show how the classic groundwater problem consisting of local, intermediate, and regional flow paths can be simulated with MODFLOW. + \item A new Streamflow Routing (SFR) Package example based on the Pinder-Sauer problem \citep{pinder1971numerical} modified by \cite{lal2001modification} was added to demonstrate the capabilities of the kinematic-wave approximation option. + \item A new Barends example was added to demonstrate the use of the Groundwater Energy (GWE) Model for simulating heat transport in a groundwater reservoir overlain by a low-permeability overburden. + % \item xxx + \end{itemize} -\textbf{\underline{BUG FIXES AND OTHER CHANGES TO EXISTING FUNCTIONALITY}} \\ -\underline{BASIC FUNCTIONALITY} -\begin{itemize} - \item The PRT model previously allowed particles to be released at any time. Release times falling outside the bounds of the simulation's time discretization could produce undefined behavior. Any release times occurring before the simulation begins (i.e. negative times) will now be skipped with a warning message. If EXTEND\_TRACKING is not enabled, release times occurring after the end of the simulation will now be skipped with a warning message as well. If EXTEND\_TRACKING is enabled, release times after the end of the simulation are allowed. -\end{itemize} + \textbf{\underline{BUG FIXES AND OTHER CHANGES TO EXISTING FUNCTIONALITY}} \\ + \underline{BASIC FUNCTIONALITY} + \begin{itemize} + \item With the LOCAL\_Z option enabled, the PRT model's PRP package attempted to check that a particle release point's z coordinate fell within the grid's vertical extent before converting the coordinate from local (normalized on the unit interval) to a global (model) coordinate. This bug was fixed by converting coordinates before conducting checks. + \item The PRT model could hang upon particle termination due to no (sub)cell exit face. This occurred because a flag signaling particle advance was not set in the proper location. + \item Entangled with the previous issue, the ternary method could erroneously terminate a particle and report no exit face (before now this would hang) due to precision error in the exit time/position calculation. This could happen when two conditions are both met: the particle enters the subcell very close to one of its vertices, and flow very nearly parallels one of the subcell's faces. We have encountered similar situations before, solved by nudging the particle a small distance into the interior of the subcell before applying the tracking method. This particular case is resolved by increasing the padding distance from $\sisetup{input-digits = 0123456789\epsilon} \num{\epsilon e+2}$ to $\sisetup{input-digits = 0123456789\epsilon} \num{\epsilon e+5}$, where $\epsilon$ is machine precision. + \item For ASCII input files erroneously containing a mix of line endings, MODFLOW would sometimes proceed with unexpected results. The program was corrected to stop with an error message if an input line contained both carriage returns and line feeds. + \item Previously the PRT model's default behavior was to track particles until termination, beyond the specified simulation end time if necessary, as with MODPATH 7 stop time option 2 (extend). Under extended tracking, a particle entrained in a cyclic flow pattern, as can occur in variable-density flow, might cycle indefinitely and never terminate. The PRT model's default behavior has been changed to the equivalent of MP7 stop time option 1 (final), terminating any active particles at the specified simulation end time. If a new particle release point (PRP) package keyword option EXTEND\_TRACKING is provided, tracking is extended until particle termination. + \item A refactor of the energy storage and transfer (EST) package associated with the GWE model type results in different input requirements that breaks backward compatibility with what was required in version 6.5.0. The PACKAGEDATA block was removed from the EST package input. In its place, the heat capacity of water, the specified density of water, and the latent heat of vaporization are instead given default values that can be overridden by specifying alternative values in the OPTIONS block. Additionally, the following variable names in the EST package input have been updated as follows: ``rhow'' changed to ``DENSITY\_WATER''; ``rhos'' changed to ``DENSITY\_SOLID''; ``cpw'' changed to ``HEAT\_CAPACITY\_WATER''; and ``cps'' changed to ``HEAT\_CAPACITY\_SOLID''. + \item The PRT model's cell face flows were improperly combined with boundary flows; for cell faces with active neighbors, the face flow replaced any boundary flows (likely a rare situation because IFLOWFACE is typically applied to faces on the boundary of the active domain). The face flow calculation has been corrected. + \item A bad pointer reference has been fixed in the PRT model. Depending on the combination of platform and compiler used to build the program, this could result in crashes (e.g. divide by zero errors) or in silent failures to properly pass particles downward between vertically adjacent cells, leading to early termination. The latter could occur as a consequence of undefined behavior which prevented detection of situations when a particle should exit a cell through its bottom face. + \item For a UZF setup with multiple UZF objects in a cell, the auxmultname option would cause the program to issue an unnecessary error. The program was corrected to remove the unnecessary error. The revised program was tested to ensure that the assignment of multiple UZF objects per cell works when it should and fails when the cumulative area of the UZF objects within a cell exceed the total area for the cell. + \item An array out of bounds error for Z-displacement output in inactive cells has been fixed in the CSUB package. Depending on the combination of platform and compiler used to build the program, this could result in crashes. + \item Initialize a few uninitialized variables in the CSUB package. Depending on the combination of platform and compiler used to build the program, this could result in different program behaviour. + \item Add a warning if saving convergence data for the CSUB package when delay beds are not included in a simulation. Also modified the convergence output data so that it is clear that DVMAX and DSTORAGEMAX data and locations are not calculated in this case (by writing `-\,-' to the output file). + \item When using SFT in a model where some of the stream reaches are not connected to an active GWF cell (the cellid parameter is set equal to either 0 or NONE) memory access violations were occurring. The program was fixed by setting the correct number of reaches connected to GWF cells. The program was tested using a new example with a DISU grid type and multiple GWF cells deactivated (idomain equals 0) that host SFR reaches. + \item Support for temperature observations was missing in the Observation (OBS) utility for a GWE model and has been added. + \item UZF was not writing a message to the GWF listing file when it had finished reading the PACKAGEDATA block. An appropriate message is now written to the GWF listing file. + \item Error checking was added to the EST package to ensure that the inputs HEAT\_CAPACITY\_WATER and DENSITY\_WATER are not 0.0. Values of 0.0 for either parameter result in a divide by zero error. + \item The PRT model's particle release point (PRP) package previously accepted release time input via options-block RELEASE\_TIMES and RELEASE\_TIMES\_FILE parameters. These have been replaced with an optional RELEASETIMES block accepting a single column of real-valued input. If the block is provided, an NRELEASETIMES value must be provided in the DIMENSIONS block. + \item Similarly, the PRT model's output control (OC) package previously accepted tracking time input via options-block TRACK\_TIMES and TRACK\_TIMES\_FILE parameters. These have been replaced with an optional TRACKTIMES block accepting a single column of real-valued input. The block is only considered if the TRACK\_USERTIME option is enabled. If the block is provided, a DIMENSIONS block containing an NTRACKTIMES value must precede it. + \item The PRT model's particle release point (PRP) package previously allowed two particles to be released at the same time from the same point. This could occur if an explicitly specified release time happened to coincide with a release time configured via period block settings. Each release point may now only release one particle at a time. Times falling within a configurable tolerance of one another (defaulting to $\sisetup{input-digits = 0123456789\epsilon} \num{\epsilon e+9}$, where $\epsilon$ is machine precision) are considered coincident and merged into a single release time. + \item A new option RELEASE\_TIME\_FREQUENCY was added to the PRT model's particle release point (PRP) package. This option configures release times on a regular interval for the duration of the simulation, with the first release at the simulation start time. The PRP package's release schedule is the union of times configured via RELEASE\_TIME\_FREQUENCY, the RELEASETIMES block, and period block release settings, up to the tolerance mentioned in the previous item. If none of these are provided, a single release time is configured at the beginning of the first stress period's first time step. (A related bug has also been fixed which erroneously activated this default when user-specified release times were configured.) + \item The PRT model's particle release point (PRP) package's FRACTION period-block release time setting has been removed. Period-block release settings can now be used only to release particles at the beginning of specified time steps, as is the case for period-block timing settings in the output control (OC) packages for all models. For fine control over release timing, specify times explicitly using the RELEASETIMES block. + \item The Stress Package Concentration (SPC) utility available with the SSM Package is now referred to as the Stress Package Component utility in the MF6IO guide. Additionally, some relatively minor refactoring of the code facilitates use of the SPC utility with the GWE model type so that TEMPERATURE arrays may be read by the utility. The SPC acronym was maintained to preserve backward compatibility. + \item The GWF-GWF Exchange has been fixed to support the configuration of the Mover package (MVR) also in cases where the number of exchanges equals zero (NEXG = 0). In earlier versions this has caused MODFLOW to terminate with an error. + \item A PRT bug was fixed in which array-based input read from the RCH (recharge) or EVT (evapotranspiration) packages could fail to be processed correctly by the PRT FMI (flow model interface) package, causing a crash. + \item When the SQUARE\_GWET option was invoked in the UZF options block, evapotranspiration from the water table (GWET) was calculated incorrectly. Instead of acting as a sink, the calculated evapotranspiration flux was added as a source of water. The applied fix ensures that groundwater evapotranspiration is removed from the water table and as a result the GWET values are accumulated as outflows in the budget table. + \item The number of characters used to represent integers and floating point numbers in MODFLOW input files was restricted to 30. The program was modified to accept any number of characters provided the number is valid. This may be useful for parameter estimation programs that use character substitution to create new input files. + \item A string to character array conversion function in the BMI interface could fail on Apple silicon macOS with recent versions of GNU Fortran, producing array extent errors at runtime. This has been fixed by properly specifying the intent of a dummy argument in the relevant function. + \item The UZF Package will facilitate UZF objects with areas less than the area of the host cell. However, within the GWE model type, the UZE package will not work properly when the area of UZF objects is not equal to the area of the host cell. New code was added to ensure that the area of each UZF object is equal to that of the host grid cell. When this condition is not satisfied, the new code will stop the simulation with an error message indicating which cell is in violation. + \item With a flow model using the Newton formulation, the PRT model could crash upon a particle's entry into a dry cell. This has been fixed. + \item With a flow model using the Newton formulation, the PRT model could enter an endless loop upon a particle's entry to a dry cell if that cell contains a boundary package (e.g. a pumping well). Where the particle should be captured and terminate, it would instead be passed back and forth between the cell bottom and the top of the cell below. To avoid this, particles are forbidden from backtracking (reentering the previous cell) within the same time step. + \item The PRT model now allows more control over vertical particle motion in dry conditions. In addition to the existing DRAPE option, which controls release-time behavior, the PRP package now provides a DRY\_TRACKING\_METHOD option which configures how dry particles (particles in dry cells, or above the water table in partially saturated cells) behave at tracking time. This option is relevant only when the Newton formulation is used, in which case dry cells remain active; otherwise, dry cells are inactive and particles will terminate. See the MF6IO document for a detailed explanation of DRY\_TRACKING\_METHOD. + \item The PRT model's Particle Release Point (PRP) package now provides an option EXIT\_SOLVE\_TOLERANCE which configures the tolerance to use when solving for a particle's exit location from a triangular subcell of an unstructured grid cell. This value is only used for the generalized (ternary) tracking method on vertex grids. A value of 0.00001 is set by default. This value works well for many problems, but the value that strikes the best balance between accuracy and runtime is problem-dependent. + \item The PRT model could write duplicative output, in volumes increasing with the current time step, due to a bug in the output file management logic. This bug has been fixed. + \item CSUB package observations that could use BOUNDNAMES was inconsistent with the input and output guide. CSUB package flow observations are the only observations that can use BOUNDNAMES. + \end{itemize} -%\underline{INTERNAL FLOW PACKAGES} -%\begin{itemize} -% \item xxx -% \item xxx -% \item xxx -%\end{itemize} + %\underline{INTERNAL FLOW PACKAGES} + %\begin{itemize} + % \item xxx + % \item xxx + % \item xxx + %\end{itemize} -%\underline{STRESS PACKAGES} -%\begin{itemize} -% \item xxx -% \item xxx -% \item xxx -%\end{itemize} + %\underline{STRESS PACKAGES} + %\begin{itemize} + % \item xxx + % \item xxx + % \item xxx + %\end{itemize} -%\underline{ADVANCED STRESS PACKAGES} -%\begin{itemize} -% \item xxx -% \item xxx -% \item xxx -%\end{itemize} + %\underline{ADVANCED STRESS PACKAGES} + %\begin{itemize} + % \item xxx + % \item xxx + % \item xxx + %\end{itemize} -%\underline{SOLUTION} -%\begin{itemize} -% \item xxx -% \item xxx -% \item xxx -%\end{itemize} + %\underline{SOLUTION} + %\begin{itemize} + % \item xxx + % \item xxx + % \item xxx + %\end{itemize} -%\underline{EXCHANGES} -%\begin{itemize} -% \item xxx -% \item xxx -% \item xxx -%\end{itemize} + %\underline{EXCHANGES} + %\begin{itemize} + % \item xxx + % \item xxx + % \item xxx + %\end{itemize} -%\underline{PARALLEL} -%\begin{itemize} -% \item xxx -% \item xxx -% \item xxx -%\end{itemize} + \underline{PARALLEL} + \begin{itemize} + \item Writing budget files for a MVR package in the GWF-GWF Exchange gave an error when running in parallel but this is fixed with this change. + \item An option has been added to the HPC package that prints the partition table to the simulation listing file. + \end{itemize} diff --git a/doc/mf6io/mf6ivar/examples/gwf-csub-example-obs.dat b/doc/mf6io/mf6ivar/examples/gwf-csub-example-obs.dat index c2598240009..7ddedecfd19 100644 --- a/doc/mf6io/mf6ivar/examples/gwf-csub-example-obs.dat +++ b/doc/mf6io/mf6ivar/examples/gwf-csub-example-obs.dat @@ -1,6 +1,8 @@ BEGIN CONTINUOUS FILEOUT my_model.csub.csv tcomp3 compaction-cell 1 1 7 - ibcensystm0 elastic-compaction nsystm0 - ibcinsystm0 inelastic-compaction nsystm0 + ibcensystm0 elastic-compaction 2 + ibcinsystm0 inelastic-compaction 2 + ibcensystm0 elastic-csub nsystm0 + ibcinsystm0 inelastic-csum nsystm0 END CONTINUOUS From 3eb2810793819a4489c3e384744899dac2b6bbb7 Mon Sep 17 00:00:00 2001 From: Joseph Hughes Date: Thu, 19 Dec 2024 14:28:30 -0600 Subject: [PATCH 5/6] format --- src/Model/GroundWaterFlow/gwf-csub.f90 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Model/GroundWaterFlow/gwf-csub.f90 b/src/Model/GroundWaterFlow/gwf-csub.f90 index 0f614473a1b..c3d8f415a85 100644 --- a/src/Model/GroundWaterFlow/gwf-csub.f90 +++ b/src/Model/GroundWaterFlow/gwf-csub.f90 @@ -7412,9 +7412,9 @@ subroutine csub_process_obsID(obsrv, dis, inunitobs, iout) else if (obsrv%ObsTypeId == 'CSUB' .or. & obsrv%ObsTypeId == 'INELASTIC-CSUB' .or. & obsrv%ObsTypeId == 'ELASTIC-CSUB' .or. & - ! obsrv%ObsTypeId == 'INTERBED-COMPACTION' .or. & - ! obsrv%ObsTypeId == 'INELASTIC-COMPACTION' .or. & - ! obsrv%ObsTypeId == 'ELASTIC-COMPACTION' .or. & + ! obsrv%ObsTypeId == 'INTERBED-COMPACTION' .or. & + ! obsrv%ObsTypeId == 'INELASTIC-COMPACTION' .or. & + ! obsrv%ObsTypeId == 'ELASTIC-COMPACTION' .or. & obsrv%ObsTypeId == 'DELAY-FLOWTOP' .or. & obsrv%ObsTypeId == 'DELAY-FLOWBOT') then if (nn1 == NAMEDBOUNDFLAG) then From 3399ab65156bf3ea5144c185035fdea755dd4c6d Mon Sep 17 00:00:00 2001 From: Joseph Hughes Date: Thu, 19 Dec 2024 14:50:10 -0600 Subject: [PATCH 6/6] format python autotests --- autotest/test_gwf_csub_obs.py | 3 +++ autotest/test_gwf_csub_subwt02.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/autotest/test_gwf_csub_obs.py b/autotest/test_gwf_csub_obs.py index c2d0014dfe7..abc694c0391 100644 --- a/autotest/test_gwf_csub_obs.py +++ b/autotest/test_gwf_csub_obs.py @@ -2,6 +2,7 @@ import pytest from framework import TestFramework +# fmt: off obs_names = [ "delay-flowtop", "delay-flowtop", "delay-flowbot", "delay-flowbot", @@ -19,6 +20,7 @@ "inelastic-compaction", "inelastic-compaction", "elastic-compaction", "elastic-compaction", ] +# fmt: off boundname = [ False, True, False, True, @@ -36,6 +38,7 @@ False, True, False, True, ] +# fmt: off test_fail = [ False, False, False, False, diff --git a/autotest/test_gwf_csub_subwt02.py b/autotest/test_gwf_csub_subwt02.py index 26f8656ec66..8c4d6e397f6 100644 --- a/autotest/test_gwf_csub_subwt02.py +++ b/autotest/test_gwf_csub_subwt02.py @@ -351,7 +351,7 @@ def get_model(idx, ws): ("w2l1", "interbed-compaction", (130,)), ("w2l2", "interbed-compaction", (340,)), ("w2l3", "interbed-compaction", (550,)), - ("w2l4", "interbed-compaction",(760,)), + ("w2l4", "interbed-compaction", (760,)), ("s1l1", "coarse-compaction", (0, 8, 9)), ("s1l2", "coarse-compaction", (1, 8, 9)), ("s1l3", "coarse-compaction", (2, 8, 9)),